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