Changes from APPLIANCE_HEAD:
[samba.git] / source3 / nmbd / nmbd.c
1 /*
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    NBT netbios routines and daemon - version 2
5    Copyright (C) Andrew Tridgell 1994-1998
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21    Revision History:
22
23    14 jan 96: lkcl@pires.co.uk
24    added multiple workgroup domain master support
25
26 */
27
28 #include "includes.h"
29
30 extern int DEBUGLEVEL;
31
32 extern pstring debugf;
33 pstring servicesf = CONFIGFILE;
34
35 int ClientNMB       = -1;
36 int ClientDGRAM     = -1;
37 int global_nmb_port = -1;
38
39 static pstring host_file;
40 extern pstring global_myname;
41 extern fstring global_myworkgroup;
42 extern char **my_netbios_names;
43
44 extern BOOL global_in_nmbd;
45
46 /* are we running as a daemon ? */
47 static BOOL is_daemon = False;
48
49 /* have we found LanMan clients yet? */
50 BOOL found_lm_clients = False;
51
52 /* what server type are we currently */
53
54 time_t StartupTime = 0;
55
56 extern struct in_addr ipzero;
57
58 /**************************************************************************** **
59   catch a sigterm
60  **************************************************************************** */
61 static void sig_term(int sig)
62 {
63   BlockSignals(True,SIGTERM);
64   
65   DEBUG(0,("Got SIGTERM: going down...\n"));
66   
67   /* Write out wins.dat file if samba is a WINS server */
68   wins_write_database(False);
69   
70   /* Remove all SELF registered names. */
71   release_my_names();
72   
73   /* Announce all server entries as 0 time-to-live, 0 type. */
74   announce_my_servers_removed();
75
76   /* If there was an async dns child - kill it. */
77   kill_async_dns_child();
78
79   exit(0);
80
81 } /* sig_term */
82
83 /**************************************************************************** **
84  catch a sighup
85  **************************************************************************** */
86 static VOLATILE SIG_ATOMIC_T reload_after_sighup = False;
87
88 static void sig_hup(int sig)
89 {
90   BlockSignals( True, SIGHUP );
91
92   DEBUG( 0, ( "Got SIGHUP dumping debug info.\n" ) );
93
94   write_browse_list( 0, True );
95
96   dump_all_namelists();
97
98   reload_after_sighup = True;
99
100   BlockSignals(False,SIGHUP);
101
102 } /* sig_hup */
103
104
105 #if DUMP_CORE
106 /**************************************************************************** **
107  prepare to dump a core file - carefully!
108  **************************************************************************** */
109 static BOOL dump_core(void)
110 {
111   char *p;
112   pstring dname;
113   pstrcpy( dname, debugf );
114   if ((p=strrchr(dname,'/')))
115     *p=0;
116   pstrcat( dname, "/corefiles" );
117   mkdir( dname, 0700 );
118   sys_chown( dname, getuid(), getgid() );
119   chmod( dname, 0700 );
120   if ( chdir(dname) )
121     return( False );
122   umask( ~(0700) );
123
124 #ifdef HAVE_GETRLIMIT
125 #ifdef RLIMIT_CORE
126   {
127     struct rlimit rlp;
128     getrlimit( RLIMIT_CORE, &rlp );
129     rlp.rlim_cur = MAX( 4*1024*1024, rlp.rlim_cur );
130     setrlimit( RLIMIT_CORE, &rlp );
131     getrlimit( RLIMIT_CORE, &rlp );
132     DEBUG( 3, ( "Core limits now %d %d\n", (int)rlp.rlim_cur, (int)rlp.rlim_max ) );
133   }
134 #endif
135 #endif
136
137
138   DEBUG(0,("Dumping core in %s\n",dname));
139   abort();
140   return( True );
141 } /* dump_core */
142 #endif
143
144
145 /**************************************************************************** **
146  possibly continue after a fault
147  **************************************************************************** */
148 static void fault_continue(void)
149 {
150 #if DUMP_CORE
151   dump_core();
152 #endif
153 } /* fault_continue */
154
155 /**************************************************************************** **
156  expire old names from the namelist and server list
157  **************************************************************************** */
158 static void expire_names_and_servers(time_t t)
159 {
160   static time_t lastrun = 0;
161   
162   if ( !lastrun )
163     lastrun = t;
164   if ( t < (lastrun + 5) )
165     return;
166   lastrun = t;
167
168   /*
169    * Expire any timed out names on all the broadcast
170    * subnets and those registered with the WINS server.
171    * (nmbd_namelistdb.c)
172    */
173   expire_names(t);
174
175   /*
176    * Go through all the broadcast subnets and for each
177    * workgroup known on that subnet remove any expired
178    * server names. If a workgroup has an empty serverlist
179    * and has itself timed out then remove the workgroup.
180    * (nmbd_workgroupdb.c)
181    */
182   expire_workgroups_and_servers(t);
183 } /* expire_names_and_servers */
184
185
186 /************************************************************************** **
187 reload the list of network interfaces
188  ************************************************************************** */
189 static BOOL reload_interfaces(time_t t)
190 {
191         static time_t lastt;
192         int n;
193         struct subnet_record *subrec;
194         extern BOOL rescan_listen_set;
195         extern struct in_addr loopback_ip;
196
197         if (t && ((t - lastt) < NMBD_INTERFACES_RELOAD)) return False;
198         lastt = t;
199
200         if (!interfaces_changed()) return False;
201
202         /* the list of probed interfaces has changed, we may need to add/remove
203            some subnets */
204         load_interfaces();
205
206         /* find any interfaces that need adding */
207         for (n=iface_count() - 1; n >= 0; n--) {
208                 struct interface *iface = get_interface(n);
209
210                 /*
211                  * We don't want to add a loopback interface, in case
212                  * someone has added 127.0.0.1 for smbd, nmbd needs to
213                  * ignore it here. JRA.
214                  */
215
216                 if (ip_equal(iface->ip, loopback_ip)) {
217                         DEBUG(2,("reload_interfaces: Ignoring loopback interface %s\n", inet_ntoa(iface->ip)));
218                         continue;
219                 }
220
221                 for (subrec=subnetlist; subrec; subrec=subrec->next) {
222                         if (ip_equal(iface->ip, subrec->myip) &&
223                             ip_equal(iface->nmask, subrec->mask_ip)) break;
224                 }
225
226                 if (!subrec) {
227                         /* it wasn't found! add it */
228                         DEBUG(2,("Found new interface %s\n", 
229                                  inet_ntoa(iface->ip)));
230                         subrec = make_normal_subnet(iface);
231                         if (subrec) register_my_workgroup_one_subnet(subrec);
232                 }
233         }
234
235         /* find any interfaces that need deleting */
236         for (subrec=subnetlist; subrec; subrec=subrec->next) {
237                 for (n=iface_count() - 1; n >= 0; n--) {
238                         struct interface *iface = get_interface(n);
239                         if (ip_equal(iface->ip, subrec->myip) &&
240                             ip_equal(iface->nmask, subrec->mask_ip)) break;
241                 }
242                 if (n == -1) {
243                         /* oops, an interface has disapeared. This is
244                          tricky, we don't dare actually free the
245                          interface as it could be being used, so
246                          instead we just wear the memory leak and
247                          remove it from the list of interfaces without
248                          freeing it */
249                         DEBUG(2,("Deleting dead interface %s\n", 
250                                  inet_ntoa(subrec->myip)));
251                         close_subnet(subrec);
252                 }
253         }
254         
255         rescan_listen_set = True;
256
257         /* We need to shutdown if there are no subnets... */
258         if (FIRST_SUBNET == NULL) {
259                 DEBUG(0,("reload_interfaces: No subnets to listen to. Shutting down...\n"));
260                 return True;
261         }
262         return False;
263 }
264
265
266
267 /**************************************************************************** **
268   reload the services file
269  **************************************************************************** */
270 static BOOL reload_nmbd_services(BOOL test)
271 {
272   BOOL ret;
273   extern fstring remote_machine;
274
275   fstrcpy( remote_machine, "nmb" );
276
277   if ( lp_loaded() )
278   {
279     pstring fname;
280     pstrcpy( fname,lp_configfile());
281     if (file_exist(fname,NULL) && !strcsequal(fname,servicesf))
282     {
283       pstrcpy(servicesf,fname);
284       test = False;
285     }
286   }
287
288   if ( test && !lp_file_list_changed() )
289     return(True);
290
291   ret = lp_load( servicesf, True , False, False);
292
293   /* perhaps the config filename is now set */
294   if ( !test )
295   {
296     DEBUG( 3, ( "services not loaded\n" ) );
297     reload_nmbd_services( True );
298   }
299
300   /* Do a sanity check for a misconfigured nmbd */
301   if( lp_wins_support() && *lp_wins_server() )
302   {
303     DEBUG(0,("ERROR: both 'wins support = true' and 'wins server = <server>' \
304 cannot be set in the smb.conf file. nmbd aborting.\n"));
305     exit(10);
306   }
307
308   return(ret);
309 } /* reload_nmbd_services */
310
311 /**************************************************************************** **
312  The main select loop.
313  **************************************************************************** */
314 static void process(void)
315 {
316   BOOL run_election;
317
318   while( True )
319   {
320     time_t t = time(NULL);
321
322     /* check for internal messages */
323     message_dispatch();
324
325     /*
326      * Check all broadcast subnets to see if
327      * we need to run an election on any of them.
328      * (nmbd_elections.c)
329      */
330     run_election = check_elections();
331
332     /*
333      * Read incoming UDP packets.
334      * (nmbd_packets.c)
335      */
336     if(listen_for_packets(run_election))
337       return;
338
339     /*
340      * Process all incoming packets
341      * read above. This calls the success and
342      * failure functions registered when response
343      * packets arrrive, and also deals with request
344      * packets from other sources.
345      * (nmbd_packets.c)
346      */
347     run_packet_queue();
348
349     /*
350      * Run any elections - initiate becoming
351      * a local master browser if we have won.
352      * (nmbd_elections.c)
353      */
354     run_elections(t);
355
356     /*
357      * Send out any broadcast announcements
358      * of our server names. This also announces
359      * the workgroup name if we are a local
360      * master browser.
361      * (nmbd_sendannounce.c)
362      */
363     announce_my_server_names(t);
364
365     /*
366      * Send out any LanMan broadcast announcements
367      * of our server names.
368      * (nmbd_sendannounce.c)
369      */
370     announce_my_lm_server_names(t);
371
372     /*
373      * If we are a local master browser, periodically
374      * announce ourselves to the domain master browser.
375      * This also deals with syncronising the domain master
376      * browser server lists with ourselves as a local
377      * master browser.
378      * (nmbd_sendannounce.c)
379      */
380     announce_myself_to_domain_master_browser(t);
381
382     /*
383      * Fullfill any remote announce requests.
384      * (nmbd_sendannounce.c)
385      */
386     announce_remote(t);
387
388     /*
389      * Fullfill any remote browse sync announce requests.
390      * (nmbd_sendannounce.c)
391      */
392     browse_sync_remote(t);
393
394     /*
395      * Scan the broadcast subnets, and WINS client
396      * namelists and refresh any that need refreshing.
397      * (nmbd_mynames.c)
398      */
399     refresh_my_names(t);
400
401     /*
402      * Scan the subnet namelists and server lists and
403      * expire thos that have timed out.
404      * (nmbd.c)
405      */
406     expire_names_and_servers(t);
407
408     /*
409      * Write out a snapshot of our current browse list into
410      * the browse.dat file. This is used by smbd to service
411      * incoming NetServerEnum calls - used to synchronise
412      * browse lists over subnets.
413      * (nmbd_serverlistdb.c)
414      */
415     write_browse_list(t, False);
416
417     /*
418      * If we are a domain master browser, we have a list of
419      * local master browsers we should synchronise browse
420      * lists with (these are added by an incoming local
421      * master browser announcement packet). Expire any of
422      * these that are no longer current, and pull the server
423      * lists from each of these known local master browsers.
424      * (nmbd_browsesync.c)
425      */
426     dmb_expire_and_sync_browser_lists(t);
427
428     /*
429      * Check that there is a local master browser for our
430      * workgroup for all our broadcast subnets. If one
431      * is not found, start an election (which we ourselves
432      * may or may not participate in, depending on the
433      * setting of the 'local master' parameter.
434      * (nmbd_elections.c)
435      */
436     check_master_browser_exists(t);
437
438     /*
439      * If we are configured as a logon server, attempt to
440      * register the special NetBIOS names to become such
441      * (WORKGROUP<1c> name) on all broadcast subnets and
442      * with the WINS server (if used). If we are configured
443      * to become a domain master browser, attempt to register
444      * the special NetBIOS name (WORKGROUP<1b> name) to
445      * become such.
446      * (nmbd_become_dmb.c)
447      */
448     add_domain_names(t);
449
450     /*
451      * If we are a WINS server, do any timer dependent
452      * processing required.
453      * (nmbd_winsserver.c)
454      */
455     initiate_wins_processing(t);
456
457     /*
458      * If we are a domain master browser, attempt to contact the
459      * WINS server to get a list of all known WORKGROUPS/DOMAINS.
460      * This will only work to a Samba WINS server.
461      * (nmbd_browsesync.c)
462      */
463     collect_all_workgroup_names_from_wins_server(t);
464
465     /*
466      * Go through the response record queue and time out or re-transmit
467      * and expired entries.
468      * (nmbd_packets.c)
469      */
470     retransmit_or_expire_response_records(t);
471
472     /*
473      * check to see if any remote browse sync child processes have completed
474      */
475     sync_check_completion();
476
477     /*
478      * regularly sync with any other DMBs we know about 
479      */
480     sync_all_dmbs(t);
481
482     /*
483      * clear the unexpected packet queue 
484      */
485     clear_unexpected(t);
486
487     /*
488      * Reload the services file if we got a sighup.
489      */
490
491     if(reload_after_sighup) {
492             reload_nmbd_services( True );
493             reopen_logs();
494             if(reload_interfaces(0))
495                         return;
496             reload_after_sighup = False;
497     }
498
499     /* check for new network interfaces */
500     if(reload_interfaces(t))
501                 return;
502
503     /* free up temp memory */
504     lp_talloc_free();
505   }
506 } /* process */
507
508
509 /**************************************************************************** **
510  open the socket communication
511  **************************************************************************** */
512 static BOOL open_sockets(BOOL isdaemon, int port)
513 {
514   /* The sockets opened here will be used to receive broadcast
515      packets *only*. Interface specific sockets are opened in
516      make_subnet() in namedbsubnet.c. Thus we bind to the
517      address "0.0.0.0". The parameter 'socket address' is
518      now deprecated.
519    */
520
521   if ( isdaemon )
522     ClientNMB = open_socket_in(SOCK_DGRAM, port,0,0,True);
523   else
524     ClientNMB = 0;
525   
526   ClientDGRAM = open_socket_in(SOCK_DGRAM,DGRAM_PORT,3,0,True);
527
528   if ( ClientNMB == -1 )
529     return( False );
530
531   /* we are never interested in SIGPIPE */
532   BlockSignals(True,SIGPIPE);
533
534   set_socket_options( ClientNMB,   "SO_BROADCAST" );
535   set_socket_options( ClientDGRAM, "SO_BROADCAST" );
536
537   DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) );
538   return( True );
539 } /* open_sockets */
540
541
542 /**************************************************************************** **
543  initialise connect, service and file structs
544  **************************************************************************** */
545 static BOOL init_structs(void)
546 {
547   extern fstring local_machine;
548   char *p, *ptr;
549   int namecount;
550   int n;
551   int nodup;
552   pstring nbname;
553
554   if (! *global_myname)
555   {
556     fstrcpy( global_myname, myhostname() );
557     p = strchr( global_myname, '.' );
558     if (p)
559       *p = 0;
560   }
561   strupper( global_myname );
562
563   /* Add any NETBIOS name aliases. Ensure that the first entry
564      is equal to global_myname.
565    */
566   /* Work out the max number of netbios aliases that we have */
567   ptr = lp_netbios_aliases();
568   for( namecount=0; next_token(&ptr,nbname,NULL, sizeof(nbname)); namecount++ )
569     ;
570   if ( *global_myname )
571     namecount++;
572
573   /* Allocate space for the netbios aliases */
574   my_netbios_names = (char **)malloc( sizeof(char *) * (namecount+1) );
575   if( NULL == my_netbios_names )
576   {
577      DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
578      return( False );
579   }
580  
581   /* Use the global_myname string first */
582   namecount=0;
583   if ( *global_myname )
584     my_netbios_names[namecount++] = global_myname;
585   
586   ptr = lp_netbios_aliases();
587   while ( next_token( &ptr, nbname, NULL, sizeof(nbname) ) )
588   {
589     strupper( nbname );
590     /* Look for duplicates */
591     nodup=1;
592     for( n=0; n<namecount; n++ )
593     {
594       if( 0 == strcmp( nbname, my_netbios_names[n] ) )
595         nodup=0;
596     }
597     if (nodup)
598       my_netbios_names[namecount++] = strdup( nbname );
599   }
600   
601   /* Check the strdups succeeded. */
602   for( n = 0; n < namecount; n++ )
603     if( NULL == my_netbios_names[n] )
604     {
605       DEBUG(0,("init_structs: malloc fail when allocating names.\n"));
606       return False;
607     }
608   
609   /* Terminate name list */
610   my_netbios_names[namecount++] = NULL;
611   
612   fstrcpy( local_machine, global_myname );
613   trim_string( local_machine, " ", " " );
614   p = strchr( local_machine, ' ' );
615   if (p)
616     *p = 0;
617   strlower( local_machine );
618
619   DEBUG( 5, ("Netbios name list:-\n") );
620   for( n=0; my_netbios_names[n]; n++ )
621     DEBUGADD( 5, ( "my_netbios_names[%d]=\"%s\"\n", n, my_netbios_names[n] ) );
622
623   return( True );
624 } /* init_structs */
625
626 /**************************************************************************** **
627  usage on the program
628  **************************************************************************** */
629 static void usage(char *pname)
630 {
631
632   printf( "Usage: %s [-DaohV] [-H lmhosts file] [-d debuglevel] [-l log basename]\n", pname );
633   printf( "       [-n name] [-p port] [-s configuration file]\n" );
634   printf( "\t-D                    Become a daemon\n" );
635   printf( "\t-a                    Append to log file (default)\n" );
636   printf( "\t-o                    Overwrite log file, don't append\n" );
637   printf( "\t-h                    Print usage\n" );
638   printf( "\t-V                    Print version\n" );
639   printf( "\t-H hosts file         Load a netbios hosts file\n" );
640   printf( "\t-d debuglevel         Set the debuglevel\n" );
641   printf( "\t-l log basename.      Basename for log/debug files\n" );
642   printf( "\t-n netbiosname.       Primary netbios name\n" );
643   printf( "\t-p port               Listen on the specified port\n" );
644   printf( "\t-s configuration file Configuration file name\n" );
645   printf( "\n");
646 } /* usage */
647
648
649 /**************************************************************************** **
650  main program
651  **************************************************************************** */
652  int main(int argc,char *argv[])
653 {
654   int opt;
655   extern FILE *dbf;
656   extern char *optarg;
657   extern BOOL  append_log;
658
659   append_log = True;  /* Default, override with '-o' option. */
660
661   global_nmb_port = NMB_PORT;
662   *host_file = 0;
663   global_in_nmbd = True;
664
665   StartupTime = time(NULL);
666
667   sys_srandom(time(NULL) ^ sys_getpid());
668
669   TimeInit();
670
671   slprintf(debugf, sizeof(debugf), "%s/log.nmbd", LOGFILEBASE);
672   setup_logging( argv[0], False );
673
674   charset_initialise();
675
676 #ifdef LMHOSTSFILE
677   pstrcpy( host_file, LMHOSTSFILE );
678 #endif
679
680   /* this is for people who can't start the program correctly */
681   while (argc > 1 && (*argv[1] != '-'))
682   {
683     argv++;
684     argc--;
685   }
686
687   fault_setup((void (*)(void *))fault_continue );
688
689   /* POSIX demands that signals are inherited. If the invoking process has
690    * these signals masked, we will have problems, as we won't recieve them. */
691   BlockSignals(False, SIGHUP);
692   BlockSignals(False, SIGUSR1);
693   BlockSignals(False, SIGTERM);
694
695   CatchSignal( SIGHUP,  SIGNAL_CAST sig_hup );
696   CatchSignal( SIGTERM, SIGNAL_CAST sig_term );
697
698 #if defined(SIGFPE)
699   /* we are never interested in SIGFPE */
700   BlockSignals(True,SIGFPE);
701 #endif
702
703   /* We no longer use USR2... */
704 #if defined(SIGUSR2)
705   BlockSignals(True, SIGUSR2);
706 #endif
707
708   while( EOF != 
709          (opt = getopt( argc, argv, "Vaos:T:I:C:bAB:N:Rn:l:d:Dp:hSH:G:f:" )) )
710     {
711       switch (opt)
712         {
713         case 's':
714           pstrcpy(servicesf,optarg);
715           break;          
716         case 'N':
717         case 'B':
718         case 'I':
719         case 'C':
720         case 'G':
721           DEBUG(0,("Obsolete option '%c' used\n",opt));
722           break;
723         case 'H':
724           pstrcpy(host_file,optarg);
725           break;
726         case 'n':
727           pstrcpy(global_myname,optarg);
728           strupper(global_myname);
729           break;
730         case 'l':
731           slprintf(debugf,sizeof(debugf)-1, "%s.nmb",optarg);
732           break;
733         case 'a':
734           append_log = True;
735           break;
736         case 'o':
737           append_log = False;
738           break;
739         case 'D':
740           is_daemon = True;
741           break;
742         case 'd':
743           DEBUGLEVEL = atoi(optarg);
744           break;
745         case 'p':
746           global_nmb_port = atoi(optarg);
747           break;
748         case 'h':
749           usage(argv[0]);
750           exit(0);
751           break;
752         case 'V':
753           printf( "Version %s\n", VERSION );
754           exit(0);
755           break;
756         default:
757           if( !is_a_socket(0) )
758           {
759             DEBUG(0,("Incorrect program usage - is the command line correct?\n"));
760             usage(argv[0]);
761             exit(0);
762           }
763           break;
764         }
765     }
766
767   reopen_logs();
768
769   DEBUG( 1, ( "Netbios nameserver version %s started.\n", VERSION ) );
770   DEBUGADD( 1, ( "Copyright Andrew Tridgell 1994-1998\n" ) );
771
772   if ( !reload_nmbd_services(False) )
773     return(-1);
774
775   codepage_initialise(lp_client_code_page());
776
777   if(!init_structs())
778     return -1;
779
780   reload_nmbd_services( True );
781
782   fstrcpy( global_myworkgroup, lp_workgroup() );
783
784   if (strequal(global_myworkgroup,"*"))
785   {
786     DEBUG(0,("ERROR: a workgroup name of * is no longer supported\n"));
787     exit(1);
788   }
789
790   set_samba_nb_type();
791
792   if (!is_daemon && !is_a_socket(0))
793   {
794     DEBUG(0,("standard input is not a socket, assuming -D option\n"));
795     is_daemon = True;
796   }
797   
798   if (is_daemon)
799   {
800     DEBUG( 2, ( "Becoming a daemon.\n" ) );
801     become_daemon();
802   }
803
804 #ifndef SYNC_DNS
805   /* Setup the async dns. We do it here so it doesn't have all the other
806      stuff initialised and thus chewing memory and sockets */
807   if(lp_we_are_a_wins_server()) {
808           start_async_dns();
809   }
810 #endif
811
812   if (!directory_exist(lp_lockdir(), NULL)) {
813           mkdir(lp_lockdir(), 0755);
814   }
815
816   pidfile_create("nmbd");
817   message_init();
818   message_register(MSG_FORCE_ELECTION, nmbd_message_election);
819
820   DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );
821
822   if ( !open_sockets( is_daemon, global_nmb_port ) )
823     return 1;
824
825   /* Determine all the IP addresses we have. */
826   load_interfaces();
827
828   /* Create an nmbd subnet record for each of the above. */
829   if( False == create_subnets() )
830   {
831     DEBUG(0,("ERROR: Failed when creating subnet lists. Exiting.\n"));
832     exit(1);
833   }
834
835   /* Load in any static local names. */ 
836   if ( *host_file )
837   {
838     load_lmhosts_file(host_file);
839     DEBUG(3,("Loaded hosts file\n"));
840   }
841
842   /* If we are acting as a WINS server, initialise data structures. */
843   if( !initialise_wins() )
844   {
845     DEBUG( 0, ( "nmbd: Failed when initialising WINS server.\n" ) );
846     exit(1);
847   }
848
849   /* 
850    * Register nmbd primary workgroup and nmbd names on all
851    * the broadcast subnets, and on the WINS server (if specified).
852    * Also initiate the startup of our primary workgroup (start
853    * elections if we are setup as being able to be a local
854    * master browser.
855    */
856
857   if( False == register_my_workgroup_and_names() )
858   {
859     DEBUG(0,("ERROR: Failed when creating my my workgroup. Exiting.\n"));
860     exit(1);
861   }
862
863   /* We can only take signals in the select. */
864   BlockSignals( True, SIGTERM );
865
866   process();
867
868   if (dbf)
869     fclose(dbf);
870   return(0);
871 } /* main */
872