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