s3: only include gen_ndr headers where needed.
[kai/samba.git] / source3 / nmbd / nmbd.c
1 /*
2    Unix SMB/CIFS implementation.
3    NBT netbios routines and daemon - version 2
4    Copyright (C) Andrew Tridgell 1994-1998
5    Copyright (C) Jeremy Allison 1997-2002
6    Copyright (C) Jelmer Vernooij 2002,2003 (Conversion to popt)
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20    
21 */
22
23 #include "includes.h"
24 #include "librpc/gen_ndr/messaging.h"
25
26 int ClientNMB       = -1;
27 int ClientDGRAM     = -1;
28 int global_nmb_port = -1;
29
30 extern bool rescan_listen_set;
31 extern bool global_in_nmbd;
32
33 extern bool override_logfile;
34
35 /* have we found LanMan clients yet? */
36 bool found_lm_clients = False;
37
38 /* what server type are we currently */
39
40 time_t StartupTime = 0;
41
42 struct event_context *nmbd_event_context(void)
43 {
44         static struct event_context *ctx;
45
46         if (!ctx && !(ctx = event_context_init(NULL))) {
47                 smb_panic("Could not init nmbd event context");
48         }
49         return ctx;
50 }
51
52 struct messaging_context *nmbd_messaging_context(void)
53 {
54         static struct messaging_context *ctx;
55
56         if (ctx == NULL) {
57                 ctx = messaging_init(NULL, procid_self(),
58                                      nmbd_event_context());
59         }
60         if (ctx == NULL) {
61                 DEBUG(0, ("Could not init nmbd messaging context.\n"));
62         }
63         return ctx;
64 }
65
66 /**************************************************************************** **
67  Handle a SIGTERM in band.
68  **************************************************************************** */
69
70 static void terminate(void)
71 {
72         DEBUG(0,("Got SIGTERM: going down...\n"));
73   
74         /* Write out wins.dat file if samba is a WINS server */
75         wins_write_database(0,False);
76   
77         /* Remove all SELF registered names from WINS */
78         release_wins_names();
79   
80         /* Announce all server entries as 0 time-to-live, 0 type. */
81         announce_my_servers_removed();
82
83         /* If there was an async dns child - kill it. */
84         kill_async_dns_child();
85
86         gencache_stabilize();
87         serverid_deregister_self();
88
89         pidfile_unlink();
90
91         exit(0);
92 }
93
94 static void nmbd_sig_term_handler(struct tevent_context *ev,
95                                   struct tevent_signal *se,
96                                   int signum,
97                                   int count,
98                                   void *siginfo,
99                                   void *private_data)
100 {
101         terminate();
102 }
103
104 static bool nmbd_setup_sig_term_handler(void)
105 {
106         struct tevent_signal *se;
107
108         se = tevent_add_signal(nmbd_event_context(),
109                                nmbd_event_context(),
110                                SIGTERM, 0,
111                                nmbd_sig_term_handler,
112                                NULL);
113         if (!se) {
114                 DEBUG(0,("failed to setup SIGTERM handler"));
115                 return false;
116         }
117
118         return true;
119 }
120
121 static void msg_reload_nmbd_services(struct messaging_context *msg,
122                                      void *private_data,
123                                      uint32_t msg_type,
124                                      struct server_id server_id,
125                                      DATA_BLOB *data);
126
127 static void nmbd_sig_hup_handler(struct tevent_context *ev,
128                                  struct tevent_signal *se,
129                                  int signum,
130                                  int count,
131                                  void *siginfo,
132                                  void *private_data)
133 {
134         DEBUG(0,("Got SIGHUP dumping debug info.\n"));
135         msg_reload_nmbd_services(nmbd_messaging_context(),
136                                  NULL, MSG_SMB_CONF_UPDATED,
137                                  procid_self(), NULL);
138 }
139
140 static bool nmbd_setup_sig_hup_handler(void)
141 {
142         struct tevent_signal *se;
143
144         se = tevent_add_signal(nmbd_event_context(),
145                                nmbd_event_context(),
146                                SIGHUP, 0,
147                                nmbd_sig_hup_handler,
148                                NULL);
149         if (!se) {
150                 DEBUG(0,("failed to setup SIGHUP handler"));
151                 return false;
152         }
153
154         return true;
155 }
156
157 /**************************************************************************** **
158  Handle a SHUTDOWN message from smbcontrol.
159  **************************************************************************** */
160
161 static void nmbd_terminate(struct messaging_context *msg,
162                            void *private_data,
163                            uint32_t msg_type,
164                            struct server_id server_id,
165                            DATA_BLOB *data)
166 {
167         terminate();
168 }
169
170 /**************************************************************************** **
171  Possibly continue after a fault.
172  **************************************************************************** */
173
174 static void fault_continue(void)
175 {
176         dump_core();
177 }
178
179 /**************************************************************************** **
180  Expire old names from the namelist and server list.
181  **************************************************************************** */
182
183 static void expire_names_and_servers(time_t t)
184 {
185         static time_t lastrun = 0;
186   
187         if ( !lastrun )
188                 lastrun = t;
189         if ( t < (lastrun + 5) )
190                 return;
191         lastrun = t;
192
193         /*
194          * Expire any timed out names on all the broadcast
195          * subnets and those registered with the WINS server.
196          * (nmbd_namelistdb.c)
197          */
198
199         expire_names(t);
200
201         /*
202          * Go through all the broadcast subnets and for each
203          * workgroup known on that subnet remove any expired
204          * server names. If a workgroup has an empty serverlist
205          * and has itself timed out then remove the workgroup.
206          * (nmbd_workgroupdb.c)
207          */
208
209         expire_workgroups_and_servers(t);
210 }
211
212 /************************************************************************** **
213  Reload the list of network interfaces.
214  Doesn't return until a network interface is up.
215  ************************************************************************** */
216
217 static void reload_interfaces(time_t t)
218 {
219         static time_t lastt;
220         int n;
221         bool print_waiting_msg = true;
222         struct subnet_record *subrec;
223
224         if (t && ((t - lastt) < NMBD_INTERFACES_RELOAD)) {
225                 return;
226         }
227
228         lastt = t;
229
230         if (!interfaces_changed()) {
231                 return;
232         }
233
234   try_again:
235
236         /* the list of probed interfaces has changed, we may need to add/remove
237            some subnets */
238         load_interfaces();
239
240         /* find any interfaces that need adding */
241         for (n=iface_count() - 1; n >= 0; n--) {
242                 char str[INET6_ADDRSTRLEN];
243                 const struct interface *iface = get_interface(n);
244                 struct in_addr ip, nmask;
245
246                 if (!iface) {
247                         DEBUG(2,("reload_interfaces: failed to get interface %d\n", n));
248                         continue;
249                 }
250
251                 /* Ensure we're only dealing with IPv4 here. */
252                 if (iface->ip.ss_family != AF_INET) {
253                         DEBUG(2,("reload_interfaces: "
254                                 "ignoring non IPv4 interface.\n"));
255                         continue;
256                 }
257
258                 ip = ((struct sockaddr_in *)&iface->ip)->sin_addr;
259                 nmask = ((struct sockaddr_in *)&iface->netmask)->sin_addr;
260
261                 /*
262                  * We don't want to add a loopback interface, in case
263                  * someone has added 127.0.0.1 for smbd, nmbd needs to
264                  * ignore it here. JRA.
265                  */
266
267                 if (is_loopback_addr((struct sockaddr *)&iface->ip)) {
268                         DEBUG(2,("reload_interfaces: Ignoring loopback "
269                                 "interface %s\n",
270                                 print_sockaddr(str, sizeof(str), &iface->ip) ));
271                         continue;
272                 }
273
274                 for (subrec=subnetlist; subrec; subrec=subrec->next) {
275                         if (ip_equal_v4(ip, subrec->myip) &&
276                             ip_equal_v4(nmask, subrec->mask_ip)) {
277                                 break;
278                         }
279                 }
280
281                 if (!subrec) {
282                         /* it wasn't found! add it */
283                         DEBUG(2,("Found new interface %s\n",
284                                  print_sockaddr(str,
285                                          sizeof(str), &iface->ip) ));
286                         subrec = make_normal_subnet(iface);
287                         if (subrec)
288                                 register_my_workgroup_one_subnet(subrec);
289                 }
290         }
291
292         /* find any interfaces that need deleting */
293         for (subrec=subnetlist; subrec; subrec=subrec->next) {
294                 for (n=iface_count() - 1; n >= 0; n--) {
295                         struct interface *iface = get_interface(n);
296                         struct in_addr ip, nmask;
297                         if (!iface) {
298                                 continue;
299                         }
300                         /* Ensure we're only dealing with IPv4 here. */
301                         if (iface->ip.ss_family != AF_INET) {
302                                 DEBUG(2,("reload_interfaces: "
303                                         "ignoring non IPv4 interface.\n"));
304                                 continue;
305                         }
306                         ip = ((struct sockaddr_in *)&iface->ip)->sin_addr;
307                         nmask = ((struct sockaddr_in *)&iface->netmask)->sin_addr;
308                         if (ip_equal_v4(ip, subrec->myip) &&
309                             ip_equal_v4(nmask, subrec->mask_ip)) {
310                                 break;
311                         }
312                 }
313                 if (n == -1) {
314                         /* oops, an interface has disapeared. This is
315                          tricky, we don't dare actually free the
316                          interface as it could be being used, so
317                          instead we just wear the memory leak and
318                          remove it from the list of interfaces without
319                          freeing it */
320                         DEBUG(2,("Deleting dead interface %s\n",
321                                  inet_ntoa(subrec->myip)));
322                         close_subnet(subrec);
323                 }
324         }
325
326         rescan_listen_set = True;
327
328         /* We need to wait if there are no subnets... */
329         if (FIRST_SUBNET == NULL) {
330                 void (*saved_handler)(int);
331
332                 if (print_waiting_msg) {
333                         DEBUG(0,("reload_interfaces: "
334                                 "No subnets to listen to. Waiting..\n"));
335                         print_waiting_msg = false;
336                 }
337
338                 /*
339                  * Whilst we're waiting for an interface, allow SIGTERM to
340                  * cause us to exit.
341                  */
342                 saved_handler = CatchSignal(SIGTERM, SIG_DFL);
343
344                 /* We only count IPv4, non-loopback interfaces here. */
345                 while (iface_count_v4_nl() == 0) {
346                         sleep(5);
347                         load_interfaces();
348                 }
349
350                 CatchSignal(SIGTERM, saved_handler);
351
352                 /*
353                  * We got an interface, go back to blocking term.
354                  */
355
356                 goto try_again;
357         }
358 }
359
360 /**************************************************************************** **
361  Reload the services file.
362  **************************************************************************** */
363
364 static bool reload_nmbd_services(bool test)
365 {
366         bool ret;
367
368         set_remote_machine_name("nmbd", False);
369
370         if ( lp_loaded() ) {
371                 const char *fname = lp_configfile();
372                 if (file_exist(fname) && !strcsequal(fname,get_dyn_CONFIGFILE())) {
373                         set_dyn_CONFIGFILE(fname);
374                         test = False;
375                 }
376         }
377
378         if ( test && !lp_file_list_changed() )
379                 return(True);
380
381         ret = lp_load(get_dyn_CONFIGFILE(), True , False, False, True);
382
383         /* perhaps the config filename is now set */
384         if ( !test ) {
385                 DEBUG( 3, ( "services not loaded\n" ) );
386                 reload_nmbd_services( True );
387         }
388
389         return(ret);
390 }
391
392 /**************************************************************************** **
393  * React on 'smbcontrol nmbd reload-config' in the same way as to SIGHUP
394  **************************************************************************** */
395
396 static void msg_reload_nmbd_services(struct messaging_context *msg,
397                                      void *private_data,
398                                      uint32_t msg_type,
399                                      struct server_id server_id,
400                                      DATA_BLOB *data)
401 {
402         write_browse_list( 0, True );
403         dump_all_namelists();
404         reload_nmbd_services( True );
405         reopen_logs();
406         reload_interfaces(0);
407 }
408
409 static void msg_nmbd_send_packet(struct messaging_context *msg,
410                                  void *private_data,
411                                  uint32_t msg_type,
412                                  struct server_id src,
413                                  DATA_BLOB *data)
414 {
415         struct packet_struct *p = (struct packet_struct *)data->data;
416         struct subnet_record *subrec;
417         struct sockaddr_storage ss;
418         const struct sockaddr_storage *pss;
419         const struct in_addr *local_ip;
420
421         DEBUG(10, ("Received send_packet from %u\n", (unsigned int)procid_to_pid(&src)));
422
423         if (data->length != sizeof(struct packet_struct)) {
424                 DEBUG(2, ("Discarding invalid packet length from %u\n",
425                           (unsigned int)procid_to_pid(&src)));
426                 return;
427         }
428
429         if ((p->packet_type != NMB_PACKET) &&
430             (p->packet_type != DGRAM_PACKET)) {
431                 DEBUG(2, ("Discarding invalid packet type from %u: %d\n",
432                           (unsigned int)procid_to_pid(&src), p->packet_type));
433                 return;
434         }
435
436         in_addr_to_sockaddr_storage(&ss, p->ip);
437         pss = iface_ip((struct sockaddr *)&ss);
438
439         if (pss == NULL) {
440                 DEBUG(2, ("Could not find ip for packet from %u\n",
441                           (unsigned int)procid_to_pid(&src)));
442                 return;
443         }
444
445         local_ip = &((const struct sockaddr_in *)pss)->sin_addr;
446         subrec = FIRST_SUBNET;
447
448         p->recv_fd = -1;
449         p->send_fd = (p->packet_type == NMB_PACKET) ?
450                 subrec->nmb_sock : subrec->dgram_sock;
451
452         for (subrec = FIRST_SUBNET; subrec != NULL;
453              subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
454                 if (ip_equal_v4(*local_ip, subrec->myip)) {
455                         p->send_fd = (p->packet_type == NMB_PACKET) ?
456                                 subrec->nmb_sock : subrec->dgram_sock;
457                         break;
458                 }
459         }
460
461         if (p->packet_type == DGRAM_PACKET) {
462                 p->port = 138;
463                 p->packet.dgram.header.source_ip.s_addr = local_ip->s_addr;
464                 p->packet.dgram.header.source_port = 138;
465         }
466
467         send_packet(p);
468 }
469
470 /**************************************************************************** **
471  The main select loop.
472  **************************************************************************** */
473
474 static void process(void)
475 {
476         bool run_election;
477
478         while( True ) {
479                 time_t t = time(NULL);
480                 TALLOC_CTX *frame = talloc_stackframe();
481
482                 /*
483                  * Check all broadcast subnets to see if
484                  * we need to run an election on any of them.
485                  * (nmbd_elections.c)
486                  */
487
488                 run_election = check_elections();
489
490                 /*
491                  * Read incoming UDP packets.
492                  * (nmbd_packets.c)
493                  */
494
495                 if(listen_for_packets(run_election)) {
496                         TALLOC_FREE(frame);
497                         return;
498                 }
499
500                 /*
501                  * Process all incoming packets
502                  * read above. This calls the success and
503                  * failure functions registered when response
504                  * packets arrrive, and also deals with request
505                  * packets from other sources.
506                  * (nmbd_packets.c)
507                  */
508
509                 run_packet_queue();
510
511                 /*
512                  * Run any elections - initiate becoming
513                  * a local master browser if we have won.
514                  * (nmbd_elections.c)
515                  */
516
517                 run_elections(t);
518
519                 /*
520                  * Send out any broadcast announcements
521                  * of our server names. This also announces
522                  * the workgroup name if we are a local
523                  * master browser.
524                  * (nmbd_sendannounce.c)
525                  */
526
527                 announce_my_server_names(t);
528
529                 /*
530                  * Send out any LanMan broadcast announcements
531                  * of our server names.
532                  * (nmbd_sendannounce.c)
533                  */
534
535                 announce_my_lm_server_names(t);
536
537                 /*
538                  * If we are a local master browser, periodically
539                  * announce ourselves to the domain master browser.
540                  * This also deals with syncronising the domain master
541                  * browser server lists with ourselves as a local
542                  * master browser.
543                  * (nmbd_sendannounce.c)
544                  */
545
546                 announce_myself_to_domain_master_browser(t);
547
548                 /*
549                  * Fullfill any remote announce requests.
550                  * (nmbd_sendannounce.c)
551                  */
552
553                 announce_remote(t);
554
555                 /*
556                  * Fullfill any remote browse sync announce requests.
557                  * (nmbd_sendannounce.c)
558                  */
559
560                 browse_sync_remote(t);
561
562                 /*
563                  * Scan the broadcast subnets, and WINS client
564                  * namelists and refresh any that need refreshing.
565                  * (nmbd_mynames.c)
566                  */
567
568                 refresh_my_names(t);
569
570                 /*
571                  * Scan the subnet namelists and server lists and
572                  * expire thos that have timed out.
573                  * (nmbd.c)
574                  */
575
576                 expire_names_and_servers(t);
577
578                 /*
579                  * Write out a snapshot of our current browse list into
580                  * the browse.dat file. This is used by smbd to service
581                  * incoming NetServerEnum calls - used to synchronise
582                  * browse lists over subnets.
583                  * (nmbd_serverlistdb.c)
584                  */
585
586                 write_browse_list(t, False);
587
588                 /*
589                  * If we are a domain master browser, we have a list of
590                  * local master browsers we should synchronise browse
591                  * lists with (these are added by an incoming local
592                  * master browser announcement packet). Expire any of
593                  * these that are no longer current, and pull the server
594                  * lists from each of these known local master browsers.
595                  * (nmbd_browsesync.c)
596                  */
597
598                 dmb_expire_and_sync_browser_lists(t);
599
600                 /*
601                  * Check that there is a local master browser for our
602                  * workgroup for all our broadcast subnets. If one
603                  * is not found, start an election (which we ourselves
604                  * may or may not participate in, depending on the
605                  * setting of the 'local master' parameter.
606                  * (nmbd_elections.c)
607                  */
608
609                 check_master_browser_exists(t);
610
611                 /*
612                  * If we are configured as a logon server, attempt to
613                  * register the special NetBIOS names to become such
614                  * (WORKGROUP<1c> name) on all broadcast subnets and
615                  * with the WINS server (if used). If we are configured
616                  * to become a domain master browser, attempt to register
617                  * the special NetBIOS name (WORKGROUP<1b> name) to
618                  * become such.
619                  * (nmbd_become_dmb.c)
620                  */
621
622                 add_domain_names(t);
623
624                 /*
625                  * If we are a WINS server, do any timer dependent
626                  * processing required.
627                  * (nmbd_winsserver.c)
628                  */
629
630                 initiate_wins_processing(t);
631
632                 /*
633                  * If we are a domain master browser, attempt to contact the
634                  * WINS server to get a list of all known WORKGROUPS/DOMAINS.
635                  * This will only work to a Samba WINS server.
636                  * (nmbd_browsesync.c)
637                  */
638
639                 if (lp_enhanced_browsing())
640                         collect_all_workgroup_names_from_wins_server(t);
641
642                 /*
643                  * Go through the response record queue and time out or re-transmit
644                  * and expired entries.
645                  * (nmbd_packets.c)
646                  */
647
648                 retransmit_or_expire_response_records(t);
649
650                 /*
651                  * check to see if any remote browse sync child processes have completed
652                  */
653
654                 sync_check_completion();
655
656                 /*
657                  * regularly sync with any other DMBs we know about 
658                  */
659
660                 if (lp_enhanced_browsing())
661                         sync_all_dmbs(t);
662
663                 /*
664                  * clear the unexpected packet queue 
665                  */
666
667                 clear_unexpected(t);
668
669                 /* check for new network interfaces */
670
671                 reload_interfaces(t);
672
673                 /* free up temp memory */
674                 TALLOC_FREE(frame);
675         }
676 }
677
678 /**************************************************************************** **
679  Open the socket communication.
680  **************************************************************************** */
681
682 static bool open_sockets(bool isdaemon, int port)
683 {
684         struct sockaddr_storage ss;
685         const char *sock_addr = lp_socket_address();
686
687         /*
688          * The sockets opened here will be used to receive broadcast
689          * packets *only*. Interface specific sockets are opened in
690          * make_subnet() in namedbsubnet.c. Thus we bind to the
691          * address "0.0.0.0". The parameter 'socket address' is
692          * now deprecated.
693          */
694
695         if (!interpret_string_addr(&ss, sock_addr,
696                                 AI_NUMERICHOST|AI_PASSIVE)) {
697                 DEBUG(0,("open_sockets: unable to get socket address "
698                         "from string %s", sock_addr));
699                 return false;
700         }
701         if (ss.ss_family != AF_INET) {
702                 DEBUG(0,("open_sockets: unable to use IPv6 socket"
703                         "%s in nmbd\n",
704                         sock_addr));
705                 return false;
706         }
707
708         if (isdaemon) {
709                 ClientNMB = open_socket_in(SOCK_DGRAM, port,
710                                            0, &ss,
711                                            true);
712         } else {
713                 ClientNMB = 0;
714         }
715
716         if (ClientNMB == -1) {
717                 return false;
718         }
719
720         ClientDGRAM = open_socket_in(SOCK_DGRAM, DGRAM_PORT,
721                                            3, &ss,
722                                            true);
723
724         if (ClientDGRAM == -1) {
725                 if (ClientNMB != 0) {
726                         close(ClientNMB);
727                 }
728                 return false;
729         }
730
731         /* we are never interested in SIGPIPE */
732         BlockSignals(True,SIGPIPE);
733
734         set_socket_options( ClientNMB,   "SO_BROADCAST" );
735         set_socket_options( ClientDGRAM, "SO_BROADCAST" );
736
737         /* Ensure we're non-blocking. */
738         set_blocking( ClientNMB, False);
739         set_blocking( ClientDGRAM, False);
740
741         DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) );
742         return( True );
743 }
744
745 /**************************************************************************** **
746  main program
747  **************************************************************************** */
748
749  int main(int argc, const char *argv[])
750 {
751         static bool is_daemon;
752         static bool opt_interactive;
753         static bool Fork = true;
754         static bool no_process_group;
755         static bool log_stdout;
756         poptContext pc;
757         char *p_lmhosts = NULL;
758         int opt;
759         enum {
760                 OPT_DAEMON = 1000,
761                 OPT_INTERACTIVE,
762                 OPT_FORK,
763                 OPT_NO_PROCESS_GROUP,
764                 OPT_LOG_STDOUT
765         };
766         struct poptOption long_options[] = {
767         POPT_AUTOHELP
768         {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon(default)" },
769         {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)" },
770         {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools & etc)" },
771         {"no-process-group", 0, POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
772         {"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
773         {"hosts", 'H', POPT_ARG_STRING, &p_lmhosts, 'H', "Load a netbios hosts file"},
774         {"port", 'p', POPT_ARG_INT, &global_nmb_port, NMB_PORT, "Listen on the specified port" },
775         POPT_COMMON_SAMBA
776         { NULL }
777         };
778         TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
779
780         load_case_tables();
781
782         global_nmb_port = NMB_PORT;
783
784         pc = poptGetContext("nmbd", argc, argv, long_options, 0);
785         while ((opt = poptGetNextOpt(pc)) != -1) {
786                 switch (opt) {
787                 case OPT_DAEMON:
788                         is_daemon = true;
789                         break;
790                 case OPT_INTERACTIVE:
791                         opt_interactive = true;
792                         break;
793                 case OPT_FORK:
794                         Fork = false;
795                         break;
796                 case OPT_NO_PROCESS_GROUP:
797                         no_process_group = true;
798                         break;
799                 case OPT_LOG_STDOUT:
800                         log_stdout = true;
801                         break;
802                 default:
803                         d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
804                                   poptBadOption(pc, 0), poptStrerror(opt));
805                         poptPrintUsage(pc, stderr, 0);
806                         exit(1);
807                 }
808         };
809         poptFreeContext(pc);
810
811         global_in_nmbd = true;
812         
813         StartupTime = time(NULL);
814         
815         sys_srandom(time(NULL) ^ sys_getpid());
816         
817         if (!override_logfile) {
818                 char *lfile = NULL;
819                 if (asprintf(&lfile, "%s/log.nmbd", get_dyn_LOGFILEBASE()) < 0) {
820                         exit(1);
821                 }
822                 lp_set_logfile(lfile);
823                 SAFE_FREE(lfile);
824         }
825         
826         fault_setup((void (*)(void *))fault_continue );
827         dump_core_setup("nmbd");
828         
829         /* POSIX demands that signals are inherited. If the invoking process has
830          * these signals masked, we will have problems, as we won't receive them. */
831         BlockSignals(False, SIGHUP);
832         BlockSignals(False, SIGUSR1);
833         BlockSignals(False, SIGTERM);
834
835 #if defined(SIGFPE)
836         /* we are never interested in SIGFPE */
837         BlockSignals(True,SIGFPE);
838 #endif
839
840         /* We no longer use USR2... */
841 #if defined(SIGUSR2)
842         BlockSignals(True, SIGUSR2);
843 #endif
844
845         if ( opt_interactive ) {
846                 Fork = False;
847                 log_stdout = True;
848         }
849
850         if ( log_stdout && Fork ) {
851                 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
852                 exit(1);
853         }
854
855         setup_logging( argv[0], log_stdout );
856
857         reopen_logs();
858
859         DEBUG(0,("nmbd version %s started.\n", samba_version_string()));
860         DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
861
862         if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
863                 DEBUG(0, ("error opening config file\n"));
864                 exit(1);
865         }
866
867         if (nmbd_messaging_context() == NULL) {
868                 return 1;
869         }
870
871         if ( !reload_nmbd_services(False) )
872                 return(-1);
873
874         if(!init_names())
875                 return -1;
876
877         reload_nmbd_services( True );
878
879         if (strequal(lp_workgroup(),"*")) {
880                 DEBUG(0,("ERROR: a workgroup name of * is no longer supported\n"));
881                 exit(1);
882         }
883
884         set_samba_nb_type();
885
886         if (!is_daemon && !is_a_socket(0)) {
887                 DEBUG(0,("standard input is not a socket, assuming -D option\n"));
888                 is_daemon = True;
889         }
890   
891         if (is_daemon && !opt_interactive) {
892                 DEBUG( 2, ( "Becoming a daemon.\n" ) );
893                 become_daemon(Fork, no_process_group, log_stdout);
894         }
895
896 #if HAVE_SETPGID
897         /*
898          * If we're interactive we want to set our own process group for 
899          * signal management.
900          */
901         if (opt_interactive && !no_process_group)
902                 setpgid( (pid_t)0, (pid_t)0 );
903 #endif
904
905         if (nmbd_messaging_context() == NULL) {
906                 return 1;
907         }
908
909 #ifndef SYNC_DNS
910         /* Setup the async dns. We do it here so it doesn't have all the other
911                 stuff initialised and thus chewing memory and sockets */
912         if(lp_we_are_a_wins_server() && lp_dns_proxy()) {
913                 start_async_dns();
914         }
915 #endif
916
917         if (!directory_exist(lp_lockdir())) {
918                 mkdir(lp_lockdir(), 0755);
919         }
920
921         pidfile_create("nmbd");
922
923         if (!NT_STATUS_IS_OK(reinit_after_fork(nmbd_messaging_context(),
924                                                nmbd_event_context(), false))) {
925                 DEBUG(0,("reinit_after_fork() failed\n"));
926                 exit(1);
927         }
928
929         if (!nmbd_setup_sig_term_handler())
930                 exit(1);
931         if (!nmbd_setup_sig_hup_handler())
932                 exit(1);
933
934         /* get broadcast messages */
935
936         if (!serverid_register_self(FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP)) {
937                 DEBUG(1, ("Could not register myself in serverid.tdb\n"));
938                 exit(1);
939         }
940
941         messaging_register(nmbd_messaging_context(), NULL,
942                            MSG_FORCE_ELECTION, nmbd_message_election);
943 #if 0
944         /* Until winsrepl is done. */
945         messaging_register(nmbd_messaging_context(), NULL,
946                            MSG_WINS_NEW_ENTRY, nmbd_wins_new_entry);
947 #endif
948         messaging_register(nmbd_messaging_context(), NULL,
949                            MSG_SHUTDOWN, nmbd_terminate);
950         messaging_register(nmbd_messaging_context(), NULL,
951                            MSG_SMB_CONF_UPDATED, msg_reload_nmbd_services);
952         messaging_register(nmbd_messaging_context(), NULL,
953                            MSG_SEND_PACKET, msg_nmbd_send_packet);
954
955         TimeInit();
956
957         DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );
958
959         if ( !open_sockets( is_daemon, global_nmb_port ) ) {
960                 kill_async_dns_child();
961                 return 1;
962         }
963
964         /* Determine all the IP addresses we have. */
965         load_interfaces();
966
967         /* Create an nmbd subnet record for each of the above. */
968         if( False == create_subnets() ) {
969                 DEBUG(0,("ERROR: Failed when creating subnet lists. Exiting.\n"));
970                 kill_async_dns_child();
971                 exit(1);
972         }
973
974         /* Load in any static local names. */ 
975         if (p_lmhosts) {
976                 set_dyn_LMHOSTSFILE(p_lmhosts);
977         }
978         load_lmhosts_file(get_dyn_LMHOSTSFILE());
979         DEBUG(3,("Loaded hosts file %s\n", get_dyn_LMHOSTSFILE()));
980
981         /* If we are acting as a WINS server, initialise data structures. */
982         if( !initialise_wins() ) {
983                 DEBUG( 0, ( "nmbd: Failed when initialising WINS server.\n" ) );
984                 kill_async_dns_child();
985                 exit(1);
986         }
987
988         /* 
989          * Register nmbd primary workgroup and nmbd names on all
990          * the broadcast subnets, and on the WINS server (if specified).
991          * Also initiate the startup of our primary workgroup (start
992          * elections if we are setup as being able to be a local
993          * master browser.
994          */
995
996         if( False == register_my_workgroup_and_names() ) {
997                 DEBUG(0,("ERROR: Failed when creating my my workgroup. Exiting.\n"));
998                 kill_async_dns_child();
999                 exit(1);
1000         }
1001
1002         if (!initialize_nmbd_proxy_logon()) {
1003                 DEBUG(0,("ERROR: Failed setup nmbd_proxy_logon.\n"));
1004                 kill_async_dns_child();
1005                 exit(1);
1006         }
1007
1008         TALLOC_FREE(frame);
1009         process();
1010
1011         if (dbf)
1012                 x_fclose(dbf);
1013         kill_async_dns_child();
1014         return(0);
1015 }