first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
[jra/samba/.git] / source3 / nmbd / nmbd_become_dmb.c
index 37fceb9bf1e785bc517b6eae3e5fc750f051fd78..ae809607dc61310df4e9c488dfb6183dd228bc75 100644 (file)
@@ -2,9 +2,9 @@
    Unix SMB/Netbios implementation.
    Version 1.9.
    NBT netbios routines and daemon - version 2
-   Copyright (C) Andrew Tridgell 1994-1997
-   Copyright (C) Luke Kenneth Casson Leighton 1994-1997
-   Copyright (C) Jeremy Allison 1994-1997
+   Copyright (C) Andrew Tridgell 1994-1998
+   Copyright (C) Luke Kenneth Casson Leighton 1994-1998
+   Copyright (C) Jeremy Allison 1994-1998
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -27,8 +27,8 @@
 extern int DEBUGLEVEL;
 
 extern pstring scope;
-extern pstring myname;
-extern fstring myworkgroup;
+extern pstring global_myname;
+extern fstring global_myworkgroup;
 extern char **my_netbios_names;
 extern struct in_addr ipzero;
 extern struct in_addr allones_ip;
@@ -37,105 +37,6 @@ extern uint16 samba_nb_type; /* Samba's NetBIOS type. */
 
 static void become_domain_master_browser_bcast(char *);
 
-/*******************************************************************
-  Unbecome a domain master browser - name release success function.
-  ******************************************************************/
-
-static void unbecome_dmb_success(struct subnet_record *subrec,
-                                 struct userdata_struct *userdata,
-                                 struct nmb_name *released_name,
-                                 struct in_addr released_ip)
-{
-  struct work_record *work = find_workgroup_on_subnet(subrec, released_name->name);
-  struct server_record *servrec;
-
-  if(!work)
-  {
-    DEBUG(0,("unbecome_dmb_success: Cannot find workgroup %s on subnet %s\n",
-             released_name->name, subrec->subnet_name));
-    return;
-  }
-
-  if((servrec = find_server_in_workgroup( work, myname)) == NULL)
-  {
-    DEBUG(0,("unbecome_dmb_success: Error - cannot find server %s \
-in workgroup %s on subnet %s\n",
-       myname, released_name->name, subrec->subnet_name));
-    return;
-  }
-
-  /* Set the state in the workgroup structure. */
-  work->dom_state = DOMAIN_NONE;
-
-  /* Update our server status. */
-  servrec->serv.type &= ~SV_TYPE_DOMAIN_MASTER;
-
-  /* Tell the namelist writer to write out a change. */
-  subrec->work_changed = True;
-
-  /* Remove any list of local master browsers we are syncing with. */
-  remove_workgroup_lmb_browsers(released_name->name);
-
-  /* Delete the known domain master browser name from the workgroup
-     struct. */
-  bzero((char *)&work->dmb_name, sizeof(work->dmb_name));
-  putip((char *)&work->dmb_addr, &ipzero);
-
-  DEBUG(0,("\n ***** Samba server %s has stopped being a domain master browser \
-for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subnet_name));
-
-}
-
-/*******************************************************************
-  Unbecome a domain master browser - name release fail function.
-  ******************************************************************/
-
-static void unbecome_dmb_fail(struct subnet_record *subrec,
-                                 struct response_record *rrec,
-                                 struct nmb_name *released_name)
-{
-  DEBUG(0,("unbecome_dmb_fail: Failed to unbecome domain master browser for \
-workgroup %s on subnet %s.\n", released_name->name, subrec->subnet_name));
-}
-
-/*******************************************************************
-  Unbecome a domain master browser.
-  ******************************************************************/
-
-void unbecome_domain_master(char *workgroup_name)
-{   
-  struct subnet_record *subrec;
-
-  for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
-  {
-    struct work_record *work = find_workgroup_on_subnet(subrec, workgroup_name);
-
-    if(work && (work->dom_state == DOMAIN_MST))
-    {
-      struct name_record *namerec;
-      struct nmb_name nmbname;
-      make_nmb_name(&nmbname,workgroup_name,0x1b,scope);
-
-      /* We can only do this if we are a domain master already. */
-      DEBUG(2,("unbecome_domain_master: attempting to stop being a domain \
-master browser for workgroup %s on subnet %s\n",
-              work->work_group, subrec->subnet_name));
-   
-      /* Find the WORKGROUP<1b> name on the subnet namelist. */
-      if((namerec = find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME))==NULL)
-      {
-        DEBUG(0,("unbecome_domain_master: Cannot find name %s on subnet %s.\n",
-                namestr(&nmbname), subrec->subnet_name));
-        continue;
-      }
-      release_name(subrec, namerec, 
-                   unbecome_dmb_success,
-                   unbecome_dmb_fail,
-                   NULL);
-    }
-  }
-} 
-
 /****************************************************************************
   Fail to become a Domain Master Browser on a subnet.
   ****************************************************************************/
@@ -157,11 +58,11 @@ workgroup %s on subnet %s\n", fail_name->name, subrec->subnet_name));
   /* Set the state back to DOMAIN_NONE. */
   work->dom_state = DOMAIN_NONE;
 
-  if((servrec = find_server_in_workgroup( work, myname)) == NULL)
+  if((servrec = find_server_in_workgroup( work, global_myname)) == NULL)
   {
     DEBUG(0,("become_domain_master_fail: Error - cannot find server %s \
 in workgroup %s on subnet %s\n",
-       myname, work->work_group, subrec->subnet_name));
+       global_myname, work->work_group, subrec->subnet_name));
     return;
   }
 
@@ -173,7 +74,7 @@ in workgroup %s on subnet %s\n",
 
   DEBUG(0,("become_domain_master_fail: Failed to become a domain master browser for \
 workgroup %s on subnet %s. Couldn't register name %s.\n",
-       work->work_group, subrec->subnet_name, namestr(fail_name)));
+       work->work_group, subrec->subnet_name, nmb_namestr(fail_name)));
 }
 
 /****************************************************************************
@@ -196,11 +97,11 @@ workgroup %s on subnet %s\n", registered_name->name, subrec->subnet_name));
     return;
   }
 
-  if((servrec = find_server_in_workgroup( work, myname)) == NULL)
+  if((servrec = find_server_in_workgroup( work, global_myname)) == NULL)
   {
     DEBUG(0,("become_domain_master_stage2: Error - cannot find server %s \
 in workgroup %s on subnet %s\n", 
-       myname, registered_name->name, subrec->subnet_name));
+       global_myname, registered_name->name, subrec->subnet_name));
     work->dom_state = DOMAIN_NONE;
     return;
   }
@@ -214,10 +115,15 @@ in workgroup %s on subnet %s\n",
   /* Tell the namelist writer to write out a change. */
   subrec->work_changed = True;
 
-  DEBUG(0,("\n ***** Samba server %s is now a domain master browser \
-for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subnet_name));
+  if( DEBUGLVL( 0 ) )
+    {
+    dbgtext( "*****\n\nSamba server %s ", global_myname );
+    dbgtext( "is now a domain master browser for " );
+    dbgtext( "workgroup %s ", work->work_group );
+    dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
+    }
 
-  if(subrec == unicast_subnet)
+  if( subrec == unicast_subnet )
   {
     struct nmb_name nmbname;
     struct in_addr my_first_ip;
@@ -227,7 +133,7 @@ for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subn
        will stop us syncing with ourself if we are also
        a local master browser. */
 
-    make_nmb_name(&nmbname, myname, 0x20, scope);
+    make_nmb_name(&nmbname, global_myname, 0x20, scope);
 
     work->dmb_name = nmbname;
     /* Pick the first interface ip address as the domain master browser ip. */
@@ -251,6 +157,16 @@ for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subn
      */
     become_domain_master_browser_bcast(work->work_group);
   }
+  else
+  {
+    /*
+     * Now we are a domain master on a broadcast subnet, we need to add
+     * the WORKGROUP<1b> name to the unicast subnet so that we can answer
+     * unicast requests sent to this name. This bug wasn't found for a while
+     * as it is strange to have a DMB without using WINS. JRA.
+     */
+    insert_permanent_name_into_unicast(subrec, registered_name, nb_flags);
+  }
 }
 
 /****************************************************************************
@@ -303,18 +219,27 @@ static void become_domain_master_query_success(struct subnet_record *subrec,
 
   if(ismyip(ip) || ip_equal(allones_ip, ip) || ip_equal(ipzero, ip))
   {
-    DEBUG(3,("become_domain_master_query_success: Our address (%s) returned \
-in query for name %s (domain master browser name) on subnet %s. \
-Continuing with domain master code.\n", 
-           inet_ntoa(ip), namestr(nmbname), subrec->subnet_name));
+    if( DEBUGLVL( 3 ) )
+    {
+      dbgtext( "become_domain_master_query_success():\n" );
+      dbgtext( "Our address (%s) ", inet_ntoa(ip) );
+      dbgtext( "returned in query for name %s ", nmb_namestr(nmbname) );
+      dbgtext( "(domain master browser name) " );
+      dbgtext( "on subnet %s.\n", subrec->subnet_name );
+      dbgtext( "Continuing with domain master code.\n" );
+    }
 
     become_domain_master_stage1(subrec, nmbname->name);
   }
   else
   {
-    DEBUG(0,("become_domain_master_query_success: There is already a domain \
-master browser at IP %s for workgroup %s registered on subnet %s.\n",
-          inet_ntoa(ip), nmbname->name, subrec->subnet_name));
+    if( DEBUGLVL( 0 ) )
+      {
+      dbgtext( "become_domain_master_query_success:\n" );
+      dbgtext( "There is already a domain master browser at " );
+      dbgtext( "IP %s for workgroup %s ", inet_ntoa(ip), nmbname->name );
+      dbgtext( "registered on subnet %s.\n", subrec->subnet_name );
+      }
   }
 }
 
@@ -334,7 +259,7 @@ static void become_domain_master_query_fail(struct subnet_record *subrec,
   {
     DEBUG(0,("become_domain_master_query_fail: Error %d returned when \
 querying WINS server for name %s.\n", 
-                  fail_code, namestr(question_name)));
+                  fail_code, nmb_namestr(question_name)));
     return;
   }
 
@@ -366,9 +291,13 @@ static void become_domain_master_browser_bcast(char *workgroup_name)
 
       if (find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME) == NULL)
       {
-        DEBUG(0,("become_domain_master_browser_bcast: At time %s attempting to become domain \
-master browser on workgroup %s on subnet %s\n", timestring(), 
-                 workgroup_name, subrec->subnet_name));
+        if( DEBUGLVL( 0 ) )
+          {
+          dbgtext( "become_domain_master_browser_bcast:\n" );
+          dbgtext( "Attempting to become domain master browser on " );
+          dbgtext( "workgroup %s on subnet %s\n",
+                    workgroup_name, subrec->subnet_name );
+          }
 
         /* Send out a query to establish whether there's a 
            domain controller on the local subnet. If not,
@@ -410,9 +339,13 @@ static void become_domain_master_browser_wins(char *workgroup_name)
 
     if (find_name_on_subnet(unicast_subnet, &nmbname, FIND_SELF_NAME) == NULL)
     {
-      DEBUG(0,("%s become_domain_master_browser_wins: attempting to become domain \
-master browser on workgroup %s, subnet %s.\n",
-      timestring(), workgroup_name, unicast_subnet->subnet_name));
+      if( DEBUGLVL( 0 ) )
+        {
+        dbgtext( "become_domain_master_browser_wins:\n" );
+        dbgtext( "Attempting to become domain master browser " );
+        dbgtext( "on workgroup %s, subnet %s.\n",
+                  workgroup_name, unicast_subnet->subnet_name );
+        }
 
       /* Send out a query to establish whether there's a 
          domain master broswer registered with WINS. If not,
@@ -421,7 +354,7 @@ master browser on workgroup %s, subnet %s.\n",
 
       DEBUG(0,("become_domain_master_browser_wins: querying WINS server at IP %s \
 for domain master browser name %s on workgroup %s\n",
-         inet_ntoa(unicast_subnet->myip), namestr(&nmbname), workgroup_name));
+         inet_ntoa(unicast_subnet->myip), nmb_namestr(&nmbname), workgroup_name));
 
       query_name(unicast_subnet, nmbname.name, nmbname.name_type,
                    become_domain_master_query_success,
@@ -463,9 +396,9 @@ void add_domain_names(time_t t)
          1.9.16p2 to 1.9.16p11 - due to a bug in namelogon.c,
          cannot provide domain master / domain logon services.
        */
-      become_domain_master_browser_wins(myworkgroup);
+      become_domain_master_browser_wins(global_myworkgroup);
     }
     else
-      become_domain_master_browser_bcast(myworkgroup);
+      become_domain_master_browser_bcast(global_myworkgroup);
   }
 }