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