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