Removed 'extern int DEBUGLEVEL' as it is now in the smb.h header.
[samba.git] / source3 / nmbd / nmbd_workgroupdb.c
index 1b97b92721e034590814d59365b32ca2dbc6a8cc..3b7a64b8e5bf2f43ce57bb3defb98998d24edf5b 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-199
-   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
 
 extern int ClientNMB;
 
-extern int DEBUGLEVEL;
-
-extern pstring myname;
-extern fstring myworkgroup;
+extern pstring global_myname;
+extern fstring global_myworkgroup;
 extern char **my_netbios_names;
 extern uint16 samba_nb_type;
 extern struct in_addr ipzero;
@@ -43,33 +41,16 @@ int workgroup_count = 0; /* unique index key: one for each workgroup */
 
 static void add_workgroup(struct subnet_record *subrec, struct work_record *work)
 {
-  struct work_record *w2;
-
-  work->subnet = subrec;
-
-  if (!subrec->workgrouplist)
-  {
-    subrec->workgrouplist = work;
-    work->prev = NULL;
-    work->next = NULL;
-    return;
-  }
-  
-  for (w2 = subrec->workgrouplist; w2->next; w2 = w2->next)
-    ;
-  
-  w2->next = work;
-  work->next = NULL;
-  work->prev = w2;
-
-  subrec->work_changed = True;
+       work->subnet = subrec;
+       DLIST_ADD(subrec->workgrouplist, work);
+       subrec->work_changed = True;
 }
 
 /****************************************************************************
   Create an empty workgroup.
   **************************************************************************/
 
-static struct work_record *create_workgroup(char *name, int ttl)
+static struct work_record *create_workgroup(const char *name, int ttl)
 {
   struct work_record *work;
   struct subnet_record *subrec;
@@ -80,7 +61,7 @@ static struct work_record *create_workgroup(char *name, int ttl)
     DEBUG(0,("create_workgroup: malloc fail !\n"));
     return NULL;
   }
-  bzero((char *)work, sizeof(*work));
+  memset((char *)work, '\0', sizeof(*work));
  
   StrnCpy(work->work_group,name,sizeof(work->work_group)-1);
   work->serverlist = NULL;
@@ -125,7 +106,7 @@ static struct work_record *create_workgroup(char *name, int ttl)
   /* WfWg  uses 01040b01 */
   /* Win95 uses 01041501 */
   /* NTAS  uses ???????? */
-  work->ElectionCriterion  = (MAINTAIN_LIST)|(ELECTION_VERSION<<8); 
+  work->ElectionCriterion  = (MAINTAIN_LIST)|(BROWSER_ELECTION_VERSION<<8); 
   work->ElectionCriterion |= (lp_os_level() << 24);
   if (lp_domain_master())
     work->ElectionCriterion |= 0x80;
@@ -158,7 +139,8 @@ static struct work_record *remove_workgroup_from_subnet(struct subnet_record *su
     if (subrec->workgrouplist == work)
       subrec->workgrouplist = work->next; 
   
-    free((char *)work);
+    ZERO_STRUCTP(work);
+    SAFE_FREE(work);
   }
   
   subrec->work_changed = True;
@@ -172,7 +154,7 @@ static struct work_record *remove_workgroup_from_subnet(struct subnet_record *su
   **************************************************************************/
 
 struct work_record *find_workgroup_on_subnet(struct subnet_record *subrec, 
-                                             fstring name)
+                                             const char *name)
 {
   struct work_record *ret;
   
@@ -183,11 +165,11 @@ struct work_record *find_workgroup_on_subnet(struct subnet_record *subrec,
   {
     if (!strcmp(ret->work_group,name))
     {
-      DEBUG(4, ("found\n"));
+      DEBUGADD(4, ("found.\n"));
       return(ret);
     }
   }
-  DEBUG(4, ("not found\n"));
+  DEBUGADD(4, ("not found.\n"));
   return NULL;
 }
 
@@ -196,7 +178,7 @@ struct work_record *find_workgroup_on_subnet(struct subnet_record *subrec,
   **************************************************************************/
 
 struct work_record *create_workgroup_on_subnet(struct subnet_record *subrec,
-                                               fstring name, int ttl)
+                                               const char *name, int ttl)
 {
   struct work_record *work = NULL;
 
@@ -235,7 +217,7 @@ static void fail_register(struct subnet_record *subrec, struct response_record *
                           struct nmb_name *nmbname)
 {  
   DEBUG(0,("fail_register: Failed to register name %s on subnet %s.\n",
-            namestr(nmbname), subrec->subnet_name));
+            nmb_namestr(nmbname), subrec->subnet_name));
 }  
 
 /****************************************************************************
@@ -246,7 +228,7 @@ void initiate_myworkgroup_startup(struct subnet_record *subrec, struct work_reco
 {
   int i;
 
-  if(!strequal(myworkgroup, work->work_group))
+  if(!strequal(global_myworkgroup, work->work_group))
     return;
 
   /* If this is a broadcast subnet then start elections on it
@@ -264,11 +246,11 @@ workgroup %s on subnet %s\n", work->work_group, subrec->subnet_name));
   
   /* Register the WORKGROUP<0> and WORKGROUP<1e> names on the network. */
 
-  register_name(subrec,myworkgroup,0x0,samba_nb_type|NB_GROUP,
+  register_name(subrec,global_myworkgroup,0x0,samba_nb_type|NB_GROUP,
                 NULL,
                 fail_register,NULL);
      
-  register_name(subrec,myworkgroup,0x1e,samba_nb_type|NB_GROUP,
+  register_name(subrec,global_myworkgroup,0x1e,samba_nb_type|NB_GROUP,
                 NULL,
                 fail_register,NULL);
      
@@ -278,12 +260,13 @@ workgroup %s on subnet %s\n", work->work_group, subrec->subnet_name));
     int stype = lp_default_server_announce() | (lp_local_master() ?
                         SV_TYPE_POTENTIAL_BROWSER : 0 );
    
-    if(!strequal(myname, name))
+    if(!strequal(global_myname, name))
         stype &= ~(SV_TYPE_MASTER_BROWSER|SV_TYPE_POTENTIAL_BROWSER|
                    SV_TYPE_DOMAIN_MASTER|SV_TYPE_DOMAIN_MEMBER);
    
     create_server_on_workgroup(work,name,stype|SV_TYPE_LOCAL_LIST_ONLY,
-                PERMANENT_TTL, lp_serverstring());
+                              PERMANENT_TTL, 
+                              string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
     DEBUG(3,("initiate_myworkgroup_startup: Added server name entry %s \
 on subnet %s\n", name, subrec->subnet_name));
   }
@@ -303,22 +286,30 @@ void dump_workgroups(BOOL force_write)
     if (subrec->workgrouplist)
     {
       struct work_record *work;
-         
-      DEBUG(debuglevel,("dump_workgroups: dump workgroup on subnet %15s: ", subrec->subnet_name));
-      DEBUG(debuglevel,(" netmask=%15s:\n", inet_ntoa(subrec->mask_ip)));
+
+      if( DEBUGLVL( debuglevel ) )
+      {
+        dbgtext( "dump_workgroups()\n " );
+        dbgtext( "dump workgroup on subnet %15s: ", subrec->subnet_name );
+        dbgtext( "netmask=%15s:\n", inet_ntoa(subrec->mask_ip) );
+      }
          
       for (work = subrec->workgrouplist; work; work = work->next)
       {
-        DEBUG(debuglevel,("\t%s(%d) current master browser = %s\n", work->work_group, 
-                  work->token, 
-                  *work->local_master_browser_name ? work->local_master_browser_name : "UNKNOWN" ));
+        DEBUGADD( debuglevel, ( "\t%s(%d) current master browser = %s\n",
+                                work->work_group,
+                                work->token, 
+                               *work->local_master_browser_name
+                              ? work->local_master_browser_name : "UNKNOWN" ) );
         if (work->serverlist)
         {
           struct server_record *servrec;                 
           for (servrec = work->serverlist; servrec; servrec = servrec->next)
           {
-            DEBUG(debuglevel,("\t\t%s %8x (%s)\n",
-                  servrec->serv.name, servrec->serv.type, servrec->serv.comment));
+            DEBUGADD( debuglevel, ( "\t\t%s %8x (%s)\n",
+                                    servrec->serv.name,
+                                    servrec->serv.type,
+                                    servrec->serv.comment ) );
           }
         }
       }