s3-includes: only include system/filesys.h when needed.
[idra/samba.git] / source3 / smbd / server.c
1 /*
2    Unix SMB/CIFS implementation.
3    Main SMB server routines
4    Copyright (C) Andrew Tridgell                1992-1998
5    Copyright (C) Martin Pool                    2002
6    Copyright (C) Jelmer Vernooij                2002-2003
7    Copyright (C) Volker Lendecke                1993-2007
8    Copyright (C) Jeremy Allison                 1993-2007
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "includes.h"
25 #include "system/filesys.h"
26 #include "popt_common.h"
27 #include "smbd/globals.h"
28 #include "librpc/gen_ndr/messaging.h"
29 #include "registry.h"
30 #include "registry/reg_init_full.h"
31 #include "libcli/auth/schannel.h"
32 #include "secrets.h"
33 #include "memcache.h"
34 #include "ctdbd_conn.h"
35 #include "printing/printer_list.h"
36 #include "rpc_server/rpc_ep_setup.h"
37 #include "printing/pcap.h"
38 #include "printing.h"
39 #include "serverid.h"
40
41 extern void start_epmd(struct tevent_context *ev_ctx,
42                        struct messaging_context *msg_ctx);
43
44 extern void start_spoolssd(struct event_context *ev_ctx,
45                            struct messaging_context *msg_ctx);
46
47 #ifdef WITH_DFS
48 extern int dcelogin_atmost_once;
49 #endif /* WITH_DFS */
50
51 static void smbd_set_server_fd(int fd)
52 {
53         struct smbd_server_connection *sconn = smbd_server_conn;
54         char addr[INET6_ADDRSTRLEN];
55         const char *name;
56
57         sconn->sock = fd;
58
59         /*
60          * Initialize sconn->client_id: If we can't find the client's
61          * name, default to its address.
62          */
63
64         client_addr(fd, sconn->client_id.addr, sizeof(sconn->client_id.addr));
65
66         name = client_name(sconn->sock);
67         if (strcmp(name, "UNKNOWN") != 0) {
68                 name = talloc_strdup(sconn, name);
69         } else {
70                 name = NULL;
71         }
72         sconn->client_id.name =
73                 (name != NULL) ? name : sconn->client_id.addr;
74
75         sub_set_socket_ids(sconn->client_id.addr, sconn->client_id.name,
76                            client_socket_addr(sconn->sock, addr,
77                                               sizeof(addr)));
78 }
79
80 struct event_context *smbd_event_context(void)
81 {
82         return server_event_context();
83 }
84
85 /*******************************************************************
86  What to do when smb.conf is updated.
87  ********************************************************************/
88
89 static void smb_conf_updated(struct messaging_context *msg,
90                              void *private_data,
91                              uint32_t msg_type,
92                              struct server_id server_id,
93                              DATA_BLOB *data)
94 {
95         struct tevent_context *ev_ctx =
96                 talloc_get_type_abort(private_data, struct tevent_context);
97
98         DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
99                   "updated. Reloading.\n"));
100         change_to_root_user();
101         reload_services(msg, smbd_server_conn->sock, False);
102         if (am_parent) {
103                 pcap_cache_reload(ev_ctx, msg,
104                                   &reload_pcap_change_notify);
105         }
106 }
107
108 /*******************************************************************
109  What to do when printcap is updated.
110  ********************************************************************/
111
112 static void smb_pcap_updated(struct messaging_context *msg,
113                              void *private_data,
114                              uint32_t msg_type,
115                              struct server_id server_id,
116                              DATA_BLOB *data)
117 {
118         struct tevent_context *ev_ctx =
119                 talloc_get_type_abort(private_data, struct tevent_context);
120
121         DEBUG(10,("Got message saying pcap was updated. Reloading.\n"));
122         change_to_root_user();
123         reload_printers(ev_ctx, msg);
124 }
125
126 /*******************************************************************
127  Delete a statcache entry.
128  ********************************************************************/
129
130 static void smb_stat_cache_delete(struct messaging_context *msg,
131                                   void *private_data,
132                                   uint32_t msg_tnype,
133                                   struct server_id server_id,
134                                   DATA_BLOB *data)
135 {
136         const char *name = (const char *)data->data;
137         DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
138         stat_cache_delete(name);
139 }
140
141 /****************************************************************************
142   Send a SIGTERM to our process group.
143 *****************************************************************************/
144
145 static void  killkids(void)
146 {
147         if(am_parent) kill(0,SIGTERM);
148 }
149
150 /****************************************************************************
151  Process a sam sync message - not sure whether to do this here or
152  somewhere else.
153 ****************************************************************************/
154
155 static void msg_sam_sync(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         DEBUG(10, ("** sam sync message received, ignoring\n"));
162 }
163
164 static void msg_exit_server(struct messaging_context *msg,
165                             void *private_data,
166                             uint32_t msg_type,
167                             struct server_id server_id,
168                             DATA_BLOB *data)
169 {
170         DEBUG(3, ("got a SHUTDOWN message\n"));
171         exit_server_cleanly(NULL);
172 }
173
174 #ifdef DEVELOPER
175 static void msg_inject_fault(struct messaging_context *msg,
176                              void *private_data,
177                              uint32_t msg_type,
178                              struct server_id src,
179                              DATA_BLOB *data)
180 {
181         int sig;
182
183         if (data->length != sizeof(sig)) {
184                 DEBUG(0, ("Process %s sent bogus signal injection request\n",
185                           procid_str_static(&src)));
186                 return;
187         }
188
189         sig = *(int *)data->data;
190         if (sig == -1) {
191                 exit_server("internal error injected");
192                 return;
193         }
194
195 #if HAVE_STRSIGNAL
196         DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
197                   procid_str_static(&src), sig, strsignal(sig)));
198 #else
199         DEBUG(0, ("Process %s requested injection of signal %d\n",
200                   procid_str_static(&src), sig));
201 #endif
202
203         kill(sys_getpid(), sig);
204 }
205 #endif /* DEVELOPER */
206
207 /*
208  * Parent smbd process sets its own debug level first and then
209  * sends a message to all the smbd children to adjust their debug
210  * level to that of the parent.
211  */
212
213 static void smbd_msg_debug(struct messaging_context *msg_ctx,
214                            void *private_data,
215                            uint32_t msg_type,
216                            struct server_id server_id,
217                            DATA_BLOB *data)
218 {
219         struct child_pid *child;
220
221         debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
222
223         for (child = children; child != NULL; child = child->next) {
224                 messaging_send_buf(msg_ctx, pid_to_procid(child->pid),
225                                    MSG_DEBUG,
226                                    data->data,
227                                    strlen((char *) data->data) + 1);
228         }
229 }
230
231 static void add_child_pid(pid_t pid)
232 {
233         struct child_pid *child;
234
235         child = SMB_MALLOC_P(struct child_pid);
236         if (child == NULL) {
237                 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
238                 return;
239         }
240         child->pid = pid;
241         DLIST_ADD(children, child);
242         num_children += 1;
243 }
244
245 /*
246   at most every smbd:cleanuptime seconds (default 20), we scan the BRL
247   and locking database for entries to cleanup. As a side effect this
248   also cleans up dead entries in the connections database (due to the
249   traversal in message_send_all()
250
251   Using a timer for this prevents a flood of traversals when a large
252   number of clients disconnect at the same time (perhaps due to a
253   network outage).  
254 */
255
256 static void cleanup_timeout_fn(struct event_context *event_ctx,
257                                 struct timed_event *te,
258                                 struct timeval now,
259                                 void *private_data)
260 {
261         struct timed_event **cleanup_te = (struct timed_event **)private_data;
262
263         DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
264         message_send_all(smbd_messaging_context(), MSG_SMB_UNLOCK, NULL, 0, NULL);
265         messaging_send_buf(smbd_messaging_context(), procid_self(),
266                                 MSG_SMB_BRL_VALIDATE, NULL, 0);
267         /* mark the cleanup as having been done */
268         (*cleanup_te) = NULL;
269 }
270
271 static void remove_child_pid(pid_t pid, bool unclean_shutdown)
272 {
273         struct child_pid *child;
274         static struct timed_event *cleanup_te;
275         struct server_id child_id;
276
277         if (unclean_shutdown) {
278                 /* a child terminated uncleanly so tickle all
279                    processes to see if they can grab any of the
280                    pending locks
281                 */
282                 DEBUG(3,(__location__ " Unclean shutdown of pid %u\n",
283                         (unsigned int)pid));
284                 if (!cleanup_te) {
285                         /* call the cleanup timer, but not too often */
286                         int cleanup_time = lp_parm_int(-1, "smbd", "cleanuptime", 20);
287                         cleanup_te = event_add_timed(smbd_event_context(), NULL,
288                                                 timeval_current_ofs(cleanup_time, 0),
289                                                 cleanup_timeout_fn,
290                                                 &cleanup_te);
291                         DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
292                 }
293         }
294
295         child_id = procid_self(); /* Just initialize pid and potentially vnn */
296         child_id.pid = pid;
297
298         if (!serverid_deregister(child_id)) {
299                 DEBUG(1, ("Could not remove pid %d from serverid.tdb\n",
300                           (int)pid));
301         }
302
303         for (child = children; child != NULL; child = child->next) {
304                 if (child->pid == pid) {
305                         struct child_pid *tmp = child;
306                         DLIST_REMOVE(children, child);
307                         SAFE_FREE(tmp);
308                         num_children -= 1;
309                         return;
310                 }
311         }
312
313         /* not all forked child processes are added to the children list */
314         DEBUG(1, ("Could not find child %d -- ignoring\n", (int)pid));
315 }
316
317 /****************************************************************************
318  Have we reached the process limit ?
319 ****************************************************************************/
320
321 static bool allowable_number_of_smbd_processes(void)
322 {
323         int max_processes = lp_max_smbd_processes();
324
325         if (!max_processes)
326                 return True;
327
328         return num_children < max_processes;
329 }
330
331 static void smbd_sig_chld_handler(struct tevent_context *ev,
332                                   struct tevent_signal *se,
333                                   int signum,
334                                   int count,
335                                   void *siginfo,
336                                   void *private_data)
337 {
338         pid_t pid;
339         int status;
340
341         while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
342                 bool unclean_shutdown = False;
343
344                 /* If the child terminated normally, assume
345                    it was an unclean shutdown unless the
346                    status is 0
347                 */
348                 if (WIFEXITED(status)) {
349                         unclean_shutdown = WEXITSTATUS(status);
350                 }
351                 /* If the child terminated due to a signal
352                    we always assume it was unclean.
353                 */
354                 if (WIFSIGNALED(status)) {
355                         unclean_shutdown = True;
356                 }
357                 remove_child_pid(pid, unclean_shutdown);
358         }
359 }
360
361 static void smbd_setup_sig_chld_handler(void)
362 {
363         struct tevent_signal *se;
364
365         se = tevent_add_signal(smbd_event_context(),
366                                smbd_event_context(),
367                                SIGCHLD, 0,
368                                smbd_sig_chld_handler,
369                                NULL);
370         if (!se) {
371                 exit_server("failed to setup SIGCHLD handler");
372         }
373 }
374
375 struct smbd_open_socket;
376
377 struct smbd_parent_context {
378         bool interactive;
379
380         /* the list of listening sockets */
381         struct smbd_open_socket *sockets;
382 };
383
384 struct smbd_open_socket {
385         struct smbd_open_socket *prev, *next;
386         struct smbd_parent_context *parent;
387         int fd;
388         struct tevent_fd *fde;
389 };
390
391 static void smbd_open_socket_close_fn(struct tevent_context *ev,
392                                       struct tevent_fd *fde,
393                                       int fd,
394                                       void *private_data)
395 {
396         /* this might be the socket_wrapper swrap_close() */
397         close(fd);
398 }
399
400 static void smbd_accept_connection(struct tevent_context *ev,
401                                    struct tevent_fd *fde,
402                                    uint16_t flags,
403                                    void *private_data)
404 {
405         struct smbd_open_socket *s = talloc_get_type_abort(private_data,
406                                      struct smbd_open_socket);
407         struct sockaddr_storage addr;
408         socklen_t in_addrlen = sizeof(addr);
409         int fd;
410         pid_t pid = 0;
411         uint64_t unique_id;
412
413         fd = accept(s->fd, (struct sockaddr *)(void *)&addr,&in_addrlen);
414         smbd_set_server_fd(fd);
415
416         if (fd == -1 && errno == EINTR)
417                 return;
418
419         if (fd == -1) {
420                 DEBUG(0,("open_sockets_smbd: accept: %s\n",
421                          strerror(errno)));
422                 return;
423         }
424
425         if (s->parent->interactive) {
426                 smbd_process(smbd_server_conn);
427                 exit_server_cleanly("end of interactive mode");
428                 return;
429         }
430
431         if (!allowable_number_of_smbd_processes()) {
432                 close(fd);
433                 smbd_set_server_fd(-1);
434                 return;
435         }
436
437         /*
438          * Generate a unique id in the parent process so that we use
439          * the global random state in the parent.
440          */
441         generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
442
443         pid = sys_fork();
444         if (pid == 0) {
445                 NTSTATUS status = NT_STATUS_OK;
446
447                 /* Child code ... */
448                 am_parent = 0;
449
450                 set_my_unique_id(unique_id);
451
452                 /* Stop zombies, the parent explicitly handles
453                  * them, counting worker smbds. */
454                 CatchChild();
455
456                 /* close our standard file
457                    descriptors */
458                 close_low_fds(False);
459
460                 /*
461                  * Can't use TALLOC_FREE here. Nulling out the argument to it
462                  * would overwrite memory we've just freed.
463                  */
464                 talloc_free(s->parent);
465                 s = NULL;
466
467                 status = reinit_after_fork(smbd_messaging_context(),
468                                            smbd_event_context(), procid_self(),
469                                            true);
470                 if (!NT_STATUS_IS_OK(status)) {
471                         if (NT_STATUS_EQUAL(status,
472                                             NT_STATUS_TOO_MANY_OPENED_FILES)) {
473                                 DEBUG(0,("child process cannot initialize "
474                                          "because too many files are open\n"));
475                                 goto exit;
476                         }
477                         DEBUG(0,("reinit_after_fork() failed\n"));
478                         smb_panic("reinit_after_fork() failed");
479                 }
480
481                 smbd_setup_sig_term_handler();
482                 smbd_setup_sig_hup_handler(server_event_context(),
483                                            server_messaging_context());
484
485                 if (!serverid_register(procid_self(),
486                                        FLAG_MSG_GENERAL|FLAG_MSG_SMBD
487                                        |FLAG_MSG_DBWRAP
488                                        |FLAG_MSG_PRINT_GENERAL)) {
489                         exit_server_cleanly("Could not register myself in "
490                                             "serverid.tdb");
491                 }
492
493                 smbd_process(smbd_server_conn);
494          exit:
495                 exit_server_cleanly("end of child");
496                 return;
497         }
498
499         if (pid < 0) {
500                 DEBUG(0,("smbd_accept_connection: sys_fork() failed: %s\n",
501                          strerror(errno)));
502         }
503
504         /* The parent doesn't need this socket */
505         close(fd);
506
507         /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
508                 Clear the closed fd info out of server_fd --
509                 and more importantly, out of client_fd in
510                 util_sock.c, to avoid a possible
511                 getpeername failure if we reopen the logs
512                 and use %I in the filename.
513         */
514
515         smbd_set_server_fd(-1);
516
517         if (pid != 0) {
518                 add_child_pid(pid);
519         }
520
521         /* Force parent to check log size after
522          * spawning child.  Fix from
523          * klausr@ITAP.Physik.Uni-Stuttgart.De.  The
524          * parent smbd will log to logserver.smb.  It
525          * writes only two messages for each child
526          * started/finished. But each child writes,
527          * say, 50 messages also in logserver.smb,
528          * begining with the debug_count of the
529          * parent, before the child opens its own log
530          * file logserver.client. In a worst case
531          * scenario the size of logserver.smb would be
532          * checked after about 50*50=2500 messages
533          * (ca. 100kb).
534          * */
535         force_check_log_size();
536 }
537
538 static bool smbd_open_one_socket(struct smbd_parent_context *parent,
539                                  const struct sockaddr_storage *ifss,
540                                  uint16_t port)
541 {
542         struct smbd_open_socket *s;
543
544         s = talloc(parent, struct smbd_open_socket);
545         if (!s) {
546                 return false;
547         }
548
549         s->parent = parent;
550         s->fd = open_socket_in(SOCK_STREAM,
551                                port,
552                                parent->sockets == NULL ? 0 : 2,
553                                ifss,
554                                true);
555         if (s->fd == -1) {
556                 DEBUG(0,("smbd_open_once_socket: open_socket_in: "
557                         "%s\n", strerror(errno)));
558                 TALLOC_FREE(s);
559                 /*
560                  * We ignore an error here, as we've done before
561                  */
562                 return true;
563         }
564
565         /* ready to listen */
566         set_socket_options(s->fd, "SO_KEEPALIVE");
567         set_socket_options(s->fd, lp_socket_options());
568
569         /* Set server socket to
570          * non-blocking for the accept. */
571         set_blocking(s->fd, False);
572
573         if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
574                 DEBUG(0,("open_sockets_smbd: listen: "
575                         "%s\n", strerror(errno)));
576                         close(s->fd);
577                 TALLOC_FREE(s);
578                 return false;
579         }
580
581         s->fde = tevent_add_fd(smbd_event_context(),
582                                s,
583                                s->fd, TEVENT_FD_READ,
584                                smbd_accept_connection,
585                                s);
586         if (!s->fde) {
587                 DEBUG(0,("open_sockets_smbd: "
588                          "tevent_add_fd: %s\n",
589                          strerror(errno)));
590                 close(s->fd);
591                 TALLOC_FREE(s);
592                 return false;
593         }
594         tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
595
596         DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
597
598         return true;
599 }
600
601 static bool smbd_parent_housekeeping(const struct timeval *now, void *private_data)
602 {
603         time_t printcap_cache_time = (time_t)lp_printcap_cache_time();
604         time_t t = time_mono(NULL);
605
606         DEBUG(5, ("parent housekeeping\n"));
607
608         /* if periodic printcap rescan is enabled, see if it's time to reload */
609         if ((printcap_cache_time != 0)
610          && (t >= (last_printer_reload_time + printcap_cache_time))) {
611                 DEBUG( 3,( "Printcap cache time expired.\n"));
612                 pcap_cache_reload(server_event_context(),
613                                   smbd_messaging_context(),
614                                   &reload_pcap_change_notify);
615                 last_printer_reload_time = t;
616         }
617
618         return true;
619 }
620
621 /****************************************************************************
622  Open the socket communication.
623 ****************************************************************************/
624
625 static bool open_sockets_smbd(struct smbd_parent_context *parent,
626                               struct messaging_context *msg_ctx,
627                               const char *smb_ports)
628 {
629         int num_interfaces = iface_count();
630         int i;
631         char *ports;
632         unsigned dns_port = 0;
633
634 #ifdef HAVE_ATEXIT
635         atexit(killkids);
636 #endif
637
638         /* Stop zombies */
639         smbd_setup_sig_chld_handler();
640
641         /* use a reasonable default set of ports - listing on 445 and 139 */
642         if (!smb_ports) {
643                 ports = lp_smb_ports();
644                 if (!ports || !*ports) {
645                         ports = talloc_strdup(talloc_tos(), SMB_PORTS);
646                 } else {
647                         ports = talloc_strdup(talloc_tos(), ports);
648                 }
649         } else {
650                 ports = talloc_strdup(talloc_tos(), smb_ports);
651         }
652
653         if (lp_interfaces() && lp_bind_interfaces_only()) {
654                 /* We have been given an interfaces line, and been
655                    told to only bind to those interfaces. Create a
656                    socket per interface and bind to only these.
657                 */
658
659                 /* Now open a listen socket for each of the
660                    interfaces. */
661                 for(i = 0; i < num_interfaces; i++) {
662                         const struct sockaddr_storage *ifss =
663                                         iface_n_sockaddr_storage(i);
664                         char *tok;
665                         const char *ptr;
666
667                         if (ifss == NULL) {
668                                 DEBUG(0,("open_sockets_smbd: "
669                                         "interface %d has NULL IP address !\n",
670                                         i));
671                                 continue;
672                         }
673
674                         for (ptr=ports;
675                              next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
676                                 unsigned port = atoi(tok);
677                                 if (port == 0 || port > 0xffff) {
678                                         continue;
679                                 }
680
681                                 if (!smbd_open_one_socket(parent, ifss, port)) {
682                                         return false;
683                                 }
684                         }
685                 }
686         } else {
687                 /* Just bind to 0.0.0.0 - accept connections
688                    from anywhere. */
689
690                 char *tok;
691                 const char *ptr;
692                 const char *sock_addr = lp_socket_address();
693                 char *sock_tok;
694                 const char *sock_ptr;
695
696                 if (strequal(sock_addr, "0.0.0.0") ||
697                     strequal(sock_addr, "::")) {
698 #if HAVE_IPV6
699                         sock_addr = "::,0.0.0.0";
700 #else
701                         sock_addr = "0.0.0.0";
702 #endif
703                 }
704
705                 for (sock_ptr=sock_addr;
706                      next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
707                         for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) {
708                                 struct sockaddr_storage ss;
709
710                                 unsigned port = atoi(tok);
711                                 if (port == 0 || port > 0xffff) {
712                                         continue;
713                                 }
714
715                                 /* Keep the first port for mDNS service
716                                  * registration.
717                                  */
718                                 if (dns_port == 0) {
719                                         dns_port = port;
720                                 }
721
722                                 /* open an incoming socket */
723                                 if (!interpret_string_addr(&ss, sock_tok,
724                                                 AI_NUMERICHOST|AI_PASSIVE)) {
725                                         continue;
726                                 }
727
728                                 if (!smbd_open_one_socket(parent, &ss, port)) {
729                                         return false;
730                                 }
731                         }
732                 }
733         }
734
735         if (parent->sockets == NULL) {
736                 DEBUG(0,("open_sockets_smbd: No "
737                         "sockets available to bind to.\n"));
738                 return false;
739         }
740
741         /* Setup the main smbd so that we can get messages. Note that
742            do this after starting listening. This is needed as when in
743            clustered mode, ctdb won't allow us to start doing database
744            operations until it has gone thru a full startup, which
745            includes checking to see that smbd is listening. */
746
747         if (!serverid_register(procid_self(),
748                                FLAG_MSG_GENERAL|FLAG_MSG_SMBD
749                                |FLAG_MSG_DBWRAP)) {
750                 DEBUG(0, ("open_sockets_smbd: Failed to register "
751                           "myself in serverid.tdb\n"));
752                 return false;
753         }
754
755         if (!(event_add_idle(smbd_event_context(), NULL,
756                              timeval_set(SMBD_HOUSEKEEPING_INTERVAL, 0),
757                              "parent_housekeeping", smbd_parent_housekeeping,
758                              NULL))) {
759                 DEBUG(0, ("Could not add parent_housekeeping event\n"));
760                 return false;
761         }
762
763         /* Listen to messages */
764
765         messaging_register(msg_ctx, NULL, MSG_SMB_SAM_SYNC, msg_sam_sync);
766         messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server);
767         messaging_register(msg_ctx, NULL, MSG_SMB_FILE_RENAME,
768                            msg_file_was_renamed);
769         messaging_register(msg_ctx, server_event_context(), MSG_SMB_CONF_UPDATED,
770                            smb_conf_updated);
771         messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE,
772                            smb_stat_cache_delete);
773         messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug);
774         messaging_register(msg_ctx, server_event_context(), MSG_PRINTER_PCAP,
775                            smb_pcap_updated);
776         brl_register_msgs(msg_ctx);
777
778         msg_idmap_register_msgs(msg_ctx);
779
780 #ifdef CLUSTER_SUPPORT
781         if (lp_clustering()) {
782                 ctdbd_register_reconfigure(messaging_ctdbd_connection());
783         }
784 #endif
785
786 #ifdef DEVELOPER
787         messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT,
788                            msg_inject_fault);
789 #endif
790
791         if (lp_multicast_dns_register() && (dns_port != 0)) {
792 #ifdef WITH_DNSSD_SUPPORT
793                 smbd_setup_mdns_registration(smbd_event_context(),
794                                              parent, dns_port);
795 #endif
796 #ifdef WITH_AVAHI_SUPPORT
797                 void *avahi_conn;
798
799                 avahi_conn = avahi_start_register(
800                         smbd_event_context(), smbd_event_context(), dns_port);
801                 if (avahi_conn == NULL) {
802                         DEBUG(10, ("avahi_start_register failed\n"));
803                 }
804 #endif
805         }
806
807         return true;
808 }
809
810 static void smbd_parent_loop(struct smbd_parent_context *parent)
811 {
812         /* now accept incoming connections - forking a new process
813            for each incoming connection */
814         DEBUG(2,("waiting for connections\n"));
815         while (1) {
816                 int ret;
817                 TALLOC_CTX *frame = talloc_stackframe();
818
819                 ret = tevent_loop_once(smbd_event_context());
820                 if (ret != 0) {
821                         exit_server_cleanly("tevent_loop_once() error");
822                 }
823
824                 TALLOC_FREE(frame);
825         } /* end while 1 */
826
827 /* NOTREACHED   return True; */
828 }
829
830
831 /****************************************************************************
832  Initialise connect, service and file structs.
833 ****************************************************************************/
834
835 static bool init_structs(void )
836 {
837         /*
838          * Set the machine NETBIOS name if not already
839          * set from the config file.
840          */
841
842         if (!init_names())
843                 return False;
844
845         if (!secrets_init())
846                 return False;
847
848         return True;
849 }
850
851 /****************************************************************************
852  main program.
853 ****************************************************************************/
854
855 /* Declare prototype for build_options() to avoid having to run it through
856    mkproto.h.  Mixing $(builddir) and $(srcdir) source files in the current
857    prototype generation system is too complicated. */
858
859 extern void build_options(bool screen);
860
861  int main(int argc,const char *argv[])
862 {
863         /* shall I run as a daemon */
864         bool is_daemon = false;
865         bool interactive = false;
866         bool Fork = true;
867         bool no_process_group = false;
868         bool log_stdout = false;
869         char *ports = NULL;
870         char *profile_level = NULL;
871         int opt;
872         poptContext pc;
873         bool print_build_options = False;
874         enum {
875                 OPT_DAEMON = 1000,
876                 OPT_INTERACTIVE,
877                 OPT_FORK,
878                 OPT_NO_PROCESS_GROUP,
879                 OPT_LOG_STDOUT
880         };
881         struct poptOption long_options[] = {
882         POPT_AUTOHELP
883         {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" },
884         {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"},
885         {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" },
886         {"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
887         {"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
888         {"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
889         {"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
890         {"profiling-level", 'P', POPT_ARG_STRING, &profile_level, 0, "Set profiling level","PROFILE_LEVEL"},
891         POPT_COMMON_SAMBA
892         POPT_COMMON_DYNCONFIG
893         POPT_TABLEEND
894         };
895         struct smbd_parent_context *parent = NULL;
896         TALLOC_CTX *frame;
897         NTSTATUS status;
898         uint64_t unique_id;
899
900         /*
901          * Do this before any other talloc operation
902          */
903         talloc_enable_null_tracking();
904         frame = talloc_stackframe();
905
906         load_case_tables();
907
908         /* Initialize the event context, it will panic on error */
909         smbd_event_context();
910
911         smbd_init_globals();
912
913         TimeInit();
914
915 #ifdef HAVE_SET_AUTH_PARAMETERS
916         set_auth_parameters(argc,argv);
917 #endif
918
919         pc = poptGetContext("smbd", argc, argv, long_options, 0);
920         while((opt = poptGetNextOpt(pc)) != -1) {
921                 switch (opt)  {
922                 case OPT_DAEMON:
923                         is_daemon = true;
924                         break;
925                 case OPT_INTERACTIVE:
926                         interactive = true;
927                         break;
928                 case OPT_FORK:
929                         Fork = false;
930                         break;
931                 case OPT_NO_PROCESS_GROUP:
932                         no_process_group = true;
933                         break;
934                 case OPT_LOG_STDOUT:
935                         log_stdout = true;
936                         break;
937                 case 'b':
938                         print_build_options = True;
939                         break;
940                 default:
941                         d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
942                                   poptBadOption(pc, 0), poptStrerror(opt));
943                         poptPrintUsage(pc, stderr, 0);
944                         exit(1);
945                 }
946         }
947         poptFreeContext(pc);
948
949         if (interactive) {
950                 Fork = False;
951                 log_stdout = True;
952         }
953
954         if (log_stdout) {
955                 setup_logging(argv[0], DEBUG_STDOUT);
956         } else {
957                 setup_logging(argv[0], DEBUG_FILE);
958         }
959
960         if (print_build_options) {
961                 build_options(True); /* Display output to screen as well as debug */
962                 exit(0);
963         }
964
965 #ifdef HAVE_SETLUID
966         /* needed for SecureWare on SCO */
967         setluid(0);
968 #endif
969
970         set_remote_machine_name("smbd", False);
971
972         if (interactive && (DEBUGLEVEL >= 9)) {
973                 talloc_enable_leak_report();
974         }
975
976         if (log_stdout && Fork) {
977                 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
978                 exit(1);
979         }
980
981         /* we want to re-seed early to prevent time delays causing
982            client problems at a later date. (tridge) */
983         generate_random_buffer(NULL, 0);
984
985         /* get initial effective uid and gid */
986         sec_init();
987
988         /* make absolutely sure we run as root - to handle cases where people
989            are crazy enough to have it setuid */
990         gain_root_privilege();
991         gain_root_group_privilege();
992
993         fault_setup();
994         dump_core_setup("smbd", lp_logfile());
995
996         /* we are never interested in SIGPIPE */
997         BlockSignals(True,SIGPIPE);
998
999 #if defined(SIGFPE)
1000         /* we are never interested in SIGFPE */
1001         BlockSignals(True,SIGFPE);
1002 #endif
1003
1004 #if defined(SIGUSR2)
1005         /* We are no longer interested in USR2 */
1006         BlockSignals(True,SIGUSR2);
1007 #endif
1008
1009         /* POSIX demands that signals are inherited. If the invoking process has
1010          * these signals masked, we will have problems, as we won't recieve them. */
1011         BlockSignals(False, SIGHUP);
1012         BlockSignals(False, SIGUSR1);
1013         BlockSignals(False, SIGTERM);
1014
1015         /* Ensure we leave no zombies until we
1016          * correctly set up child handling below. */
1017
1018         CatchChild();
1019
1020         /* we want total control over the permissions on created files,
1021            so set our umask to 0 */
1022         umask(0);
1023
1024         reopen_logs();
1025
1026         DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1027         DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1028
1029         DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1030                  (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1031
1032         /* Output the build options to the debug log */ 
1033         build_options(False);
1034
1035         if (sizeof(uint16) < 2 || sizeof(uint32) < 4) {
1036                 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1037                 exit(1);
1038         }
1039
1040         if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1041                 DEBUG(0, ("error opening config file '%s'\n", get_dyn_CONFIGFILE()));
1042                 exit(1);
1043         }
1044
1045         /* Init the security context and global current_user */
1046         init_sec_ctx();
1047
1048         if (smbd_messaging_context() == NULL)
1049                 exit(1);
1050
1051         /*
1052          * Reloading of the printers will not work here as we don't have a
1053          * server info and rpc services set up. It will be called later.
1054          */
1055         if (!reload_services(smbd_messaging_context(), -1, False)) {
1056                 exit(1);
1057         }
1058
1059         /* ...NOTE... Log files are working from this point! */
1060
1061         DEBUG(3,("loaded services\n"));
1062
1063         init_structs();
1064
1065 #ifdef WITH_PROFILE
1066         if (!profile_setup(smbd_messaging_context(), False)) {
1067                 DEBUG(0,("ERROR: failed to setup profiling\n"));
1068                 return -1;
1069         }
1070         if (profile_level != NULL) {
1071                 int pl = atoi(profile_level);
1072                 struct server_id src;
1073
1074                 DEBUG(1, ("setting profiling level: %s\n",profile_level));
1075                 src.pid = getpid();
1076                 set_profile_level(pl, src);
1077         }
1078 #endif
1079
1080         if (!is_daemon && !is_a_socket(0)) {
1081                 if (!interactive)
1082                         DEBUG(0,("standard input is not a socket, assuming -D option\n"));
1083
1084                 /*
1085                  * Setting is_daemon here prevents us from eventually calling
1086                  * the open_sockets_inetd()
1087                  */
1088
1089                 is_daemon = True;
1090         }
1091
1092         if (is_daemon && !interactive) {
1093                 DEBUG( 3, ( "Becoming a daemon.\n" ) );
1094                 become_daemon(Fork, no_process_group, log_stdout);
1095         }
1096
1097         generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
1098         set_my_unique_id(unique_id);
1099
1100 #if HAVE_SETPGID
1101         /*
1102          * If we're interactive we want to set our own process group for
1103          * signal management.
1104          */
1105         if (interactive && !no_process_group)
1106                 setpgid( (pid_t)0, (pid_t)0);
1107 #endif
1108
1109         if (!directory_exist(lp_lockdir()))
1110                 mkdir(lp_lockdir(), 0755);
1111
1112         if (is_daemon)
1113                 pidfile_create("smbd");
1114
1115         status = reinit_after_fork(smbd_messaging_context(),
1116                                    smbd_event_context(),
1117                                    procid_self(), false);
1118         if (!NT_STATUS_IS_OK(status)) {
1119                 DEBUG(0,("reinit_after_fork() failed\n"));
1120                 exit(1);
1121         }
1122
1123         smbd_server_conn->msg_ctx = smbd_messaging_context();
1124
1125         smbd_setup_sig_term_handler();
1126         smbd_setup_sig_hup_handler(smbd_event_context(),
1127                                    smbd_server_conn->msg_ctx);
1128
1129         /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1130
1131         if (smbd_memcache() == NULL) {
1132                 exit(1);
1133         }
1134
1135         memcache_set_global(smbd_memcache());
1136
1137         /* Initialise the password backed before the global_sam_sid
1138            to ensure that we fetch from ldap before we make a domain sid up */
1139
1140         if(!initialize_password_db(False, smbd_event_context()))
1141                 exit(1);
1142
1143         if (!secrets_init()) {
1144                 DEBUG(0, ("ERROR: smbd can not open secrets.tdb\n"));
1145                 exit(1);
1146         }
1147
1148         if (lp_server_role() == ROLE_DOMAIN_BDC || lp_server_role() == ROLE_DOMAIN_PDC) {
1149                 if (!open_schannel_session_store(NULL, lp_private_dir())) {
1150                         DEBUG(0,("ERROR: Samba cannot open schannel store for secured NETLOGON operations.\n"));
1151                         exit(1);
1152                 }
1153         }
1154
1155         if(!get_global_sam_sid()) {
1156                 DEBUG(0,("ERROR: Samba cannot create a SAM SID.\n"));
1157                 exit(1);
1158         }
1159
1160         if (!sessionid_init()) {
1161                 exit(1);
1162         }
1163
1164         if (!connections_init(True))
1165                 exit(1);
1166
1167         if (!locking_init())
1168                 exit(1);
1169
1170         if (!messaging_tdb_parent_init(smbd_event_context())) {
1171                 exit(1);
1172         }
1173
1174         if (!notify_internal_parent_init(smbd_event_context())) {
1175                 exit(1);
1176         }
1177
1178         if (!serverid_parent_init(smbd_event_context())) {
1179                 exit(1);
1180         }
1181
1182         if (!printer_list_parent_init()) {
1183                 exit(1);
1184         }
1185
1186         if (!W_ERROR_IS_OK(registry_init_full()))
1187                 exit(1);
1188
1189         if (!print_backend_init(smbd_messaging_context()))
1190                 exit(1);
1191
1192         /* Open the share_info.tdb here, so we don't have to open
1193            after the fork on every single connection.  This is a small
1194            performance improvment and reduces the total number of system
1195            fds used. */
1196         if (!share_info_db_init()) {
1197                 DEBUG(0,("ERROR: failed to load share info db.\n"));
1198                 exit(1);
1199         }
1200
1201         status = init_system_info();
1202         if (!NT_STATUS_IS_OK(status)) {
1203                 DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
1204                           nt_errstr(status)));
1205                 return -1;
1206         }
1207
1208         if (!init_guest_info()) {
1209                 DEBUG(0,("ERROR: failed to setup guest info.\n"));
1210                 return -1;
1211         }
1212
1213         if (!file_init(smbd_server_conn)) {
1214                 DEBUG(0, ("ERROR: file_init failed\n"));
1215                 return -1;
1216         }
1217
1218         if (is_daemon && !interactive) {
1219                 const char *rpcsrv_type;
1220
1221                 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
1222                                                    "rpc_server", "epmapper",
1223                                                    "none");
1224                 if (StrCaseCmp(rpcsrv_type, "daemon") == 0) {
1225                         start_epmd(smbd_event_context(),
1226                                    smbd_server_conn->msg_ctx);
1227                 }
1228         }
1229
1230         if (!dcesrv_ep_setup(smbd_event_context(), smbd_server_conn->msg_ctx)) {
1231                 exit(1);
1232         }
1233
1234         /* Publish nt printers, this requires a working winreg pipe */
1235         pcap_cache_reload(server_event_context(), smbd_messaging_context(),
1236                           &reload_printers);
1237
1238         /* only start the background queue daemon if we are 
1239            running as a daemon -- bad things will happen if
1240            smbd is launched via inetd and we fork a copy of 
1241            ourselves here */
1242
1243         if (is_daemon && !interactive
1244             && lp_parm_bool(-1, "smbd", "backgroundqueue", true)) {
1245                 start_background_queue(smbd_event_context(),
1246                                        smbd_messaging_context());
1247         }
1248
1249         if (is_daemon && !_lp_disable_spoolss()) {
1250                 const char *rpcsrv_type;
1251
1252                 /* start spoolss daemon */
1253                 /* start as a separate daemon only if enabled */
1254                 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
1255                                                    "rpc_server", "spoolss",
1256                                                    "embedded");
1257                 if (StrCaseCmp(rpcsrv_type, "daemon") == 0) {
1258                         start_spoolssd(smbd_event_context(),
1259                                        smbd_messaging_context());
1260                 }
1261         }
1262
1263         if (!is_daemon) {
1264                 /* inetd mode */
1265                 TALLOC_FREE(frame);
1266
1267                 /* Started from inetd. fd 0 is the socket. */
1268                 /* We will abort gracefully when the client or remote system
1269                    goes away */
1270                 smbd_set_server_fd(dup(0));
1271
1272                 /* close our standard file descriptors */
1273                 close_low_fds(False); /* Don't close stderr */
1274
1275 #ifdef HAVE_ATEXIT
1276                 atexit(killkids);
1277 #endif
1278
1279                 /* Stop zombies */
1280                 smbd_setup_sig_chld_handler();
1281
1282                 smbd_process(smbd_server_conn);
1283
1284                 exit_server_cleanly(NULL);
1285                 return(0);
1286         }
1287
1288         parent = talloc_zero(smbd_event_context(), struct smbd_parent_context);
1289         if (!parent) {
1290                 exit_server("talloc(struct smbd_parent_context) failed");
1291         }
1292         parent->interactive = interactive;
1293
1294         if (!open_sockets_smbd(parent, smbd_messaging_context(), ports))
1295                 exit_server("open_sockets_smbd() failed");
1296
1297         TALLOC_FREE(frame);
1298         /* make sure we always have a valid stackframe */
1299         frame = talloc_stackframe();
1300
1301         smbd_parent_loop(parent);
1302
1303         exit_server_cleanly(NULL);
1304         TALLOC_FREE(frame);
1305         return(0);
1306 }