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
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.
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.
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/>.
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"
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"
41 #include "smbprofile.h"
42 #include "lib/id_cache.h"
44 extern void start_epmd(struct tevent_context *ev_ctx,
45 struct messaging_context *msg_ctx);
47 extern void start_lsasd(struct event_context *ev_ctx,
48 struct messaging_context *msg_ctx);
51 extern int dcelogin_atmost_once;
54 /*******************************************************************
55 What to do when smb.conf is updated.
56 ********************************************************************/
58 static void smb_conf_updated(struct messaging_context *msg,
61 struct server_id server_id,
64 struct tevent_context *ev_ctx =
65 talloc_get_type_abort(private_data, struct tevent_context);
66 struct smbd_server_connection *sconn = msg_ctx_to_sconn(msg);
68 DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
69 "updated. Reloading.\n"));
70 change_to_root_user();
71 reload_services(msg, sconn->sock, False);
73 printing_subsystem_update(ev_ctx, msg, false);
77 /*******************************************************************
78 What to do when printcap is updated.
79 ********************************************************************/
81 static void smb_pcap_updated(struct messaging_context *msg,
84 struct server_id server_id,
87 struct tevent_context *ev_ctx =
88 talloc_get_type_abort(private_data, struct tevent_context);
90 DEBUG(10,("Got message saying pcap was updated. Reloading.\n"));
91 change_to_root_user();
92 delete_and_reload_printers(ev_ctx, msg);
95 /*******************************************************************
96 Delete a statcache entry.
97 ********************************************************************/
99 static void smb_stat_cache_delete(struct messaging_context *msg,
102 struct server_id server_id,
105 const char *name = (const char *)data->data;
106 DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
107 stat_cache_delete(name);
110 /****************************************************************************
111 Send a SIGTERM to our process group.
112 *****************************************************************************/
114 static void killkids(void)
116 if(am_parent) kill(0,SIGTERM);
119 /****************************************************************************
120 Process a sam sync message - not sure whether to do this here or
122 ****************************************************************************/
124 static void msg_sam_sync(struct messaging_context *msg,
127 struct server_id server_id,
130 DEBUG(10, ("** sam sync message received, ignoring\n"));
133 static void msg_exit_server(struct messaging_context *msg,
136 struct server_id server_id,
139 DEBUG(3, ("got a SHUTDOWN message\n"));
140 exit_server_cleanly(NULL);
144 static void msg_inject_fault(struct messaging_context *msg,
147 struct server_id src,
152 if (data->length != sizeof(sig)) {
153 DEBUG(0, ("Process %s sent bogus signal injection request\n",
154 procid_str_static(&src)));
158 sig = *(int *)data->data;
160 exit_server("internal error injected");
165 DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
166 procid_str_static(&src), sig, strsignal(sig)));
168 DEBUG(0, ("Process %s requested injection of signal %d\n",
169 procid_str_static(&src), sig));
172 kill(sys_getpid(), sig);
174 #endif /* DEVELOPER */
176 NTSTATUS messaging_send_to_children(struct messaging_context *msg_ctx,
177 uint32_t msg_type, DATA_BLOB* data)
180 struct child_pid *child;
182 for (child = children; child != NULL; child = child->next) {
183 status = messaging_send(msg_ctx, pid_to_procid(child->pid),
185 if (!NT_STATUS_IS_OK(status)) {
193 * Parent smbd process sets its own debug level first and then
194 * sends a message to all the smbd children to adjust their debug
195 * level to that of the parent.
198 static void smbd_msg_debug(struct messaging_context *msg_ctx,
201 struct server_id server_id,
204 debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
206 messaging_send_to_children(msg_ctx, MSG_DEBUG, data);
209 static void add_child_pid(pid_t pid)
211 struct child_pid *child;
213 child = SMB_MALLOC_P(struct child_pid);
215 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
219 DLIST_ADD(children, child);
224 at most every smbd:cleanuptime seconds (default 20), we scan the BRL
225 and locking database for entries to cleanup. As a side effect this
226 also cleans up dead entries in the connections database (due to the
227 traversal in message_send_all()
229 Using a timer for this prevents a flood of traversals when a large
230 number of clients disconnect at the same time (perhaps due to a
234 static void cleanup_timeout_fn(struct event_context *event_ctx,
235 struct timed_event *te,
239 struct timed_event **cleanup_te = (struct timed_event **)private_data;
241 DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
242 message_send_all(smbd_messaging_context(), MSG_SMB_UNLOCK, NULL, 0, NULL);
243 messaging_send_buf(smbd_messaging_context(), procid_self(),
244 MSG_SMB_BRL_VALIDATE, NULL, 0);
245 /* mark the cleanup as having been done */
246 (*cleanup_te) = NULL;
249 static void remove_child_pid(struct tevent_context *ev_ctx,
251 bool unclean_shutdown)
253 struct child_pid *child;
254 static struct timed_event *cleanup_te;
255 struct server_id child_id;
257 if (unclean_shutdown) {
258 /* a child terminated uncleanly so tickle all
259 processes to see if they can grab any of the
262 DEBUG(3,(__location__ " Unclean shutdown of pid %u\n",
265 /* call the cleanup timer, but not too often */
266 int cleanup_time = lp_parm_int(-1, "smbd", "cleanuptime", 20);
267 cleanup_te = event_add_timed(ev_ctx, NULL,
268 timeval_current_ofs(cleanup_time, 0),
271 DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
275 child_id = procid_self(); /* Just initialize pid and potentially vnn */
278 if (!serverid_deregister(child_id)) {
279 DEBUG(1, ("Could not remove pid %d from serverid.tdb\n",
283 for (child = children; child != NULL; child = child->next) {
284 if (child->pid == pid) {
285 struct child_pid *tmp = child;
286 DLIST_REMOVE(children, child);
293 /* not all forked child processes are added to the children list */
294 DEBUG(1, ("Could not find child %d -- ignoring\n", (int)pid));
297 /****************************************************************************
298 Have we reached the process limit ?
299 ****************************************************************************/
301 static bool allowable_number_of_smbd_processes(void)
303 int max_processes = lp_max_smbd_processes();
308 return num_children < max_processes;
311 static void smbd_sig_chld_handler(struct tevent_context *ev,
312 struct tevent_signal *se,
321 while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
322 bool unclean_shutdown = False;
324 /* If the child terminated normally, assume
325 it was an unclean shutdown unless the
328 if (WIFEXITED(status)) {
329 unclean_shutdown = WEXITSTATUS(status);
331 /* If the child terminated due to a signal
332 we always assume it was unclean.
334 if (WIFSIGNALED(status)) {
335 unclean_shutdown = True;
337 remove_child_pid(ev, pid, unclean_shutdown);
341 static void smbd_setup_sig_chld_handler(struct tevent_context *ev_ctx)
343 struct tevent_signal *se;
345 se = tevent_add_signal(ev_ctx,
346 ev_ctx, /* mem_ctx */
348 smbd_sig_chld_handler,
351 exit_server("failed to setup SIGCHLD handler");
355 struct smbd_open_socket;
357 struct smbd_parent_context {
360 /* the list of listening sockets */
361 struct smbd_open_socket *sockets;
364 struct smbd_open_socket {
365 struct smbd_open_socket *prev, *next;
366 struct smbd_parent_context *parent;
368 struct tevent_fd *fde;
369 struct messaging_context *msg_ctx;
372 static void smbd_open_socket_close_fn(struct tevent_context *ev,
373 struct tevent_fd *fde,
377 /* this might be the socket_wrapper swrap_close() */
381 static void smbd_accept_connection(struct tevent_context *ev,
382 struct tevent_fd *fde,
386 struct smbd_open_socket *s = talloc_get_type_abort(private_data,
387 struct smbd_open_socket);
388 struct messaging_context *msg_ctx = s->msg_ctx;
389 struct smbd_server_connection *sconn = msg_ctx_to_sconn(msg_ctx);
390 struct sockaddr_storage addr;
391 socklen_t in_addrlen = sizeof(addr);
396 fd = accept(s->fd, (struct sockaddr *)(void *)&addr,&in_addrlen);
398 if (fd == -1 && errno == EINTR)
402 DEBUG(0,("open_sockets_smbd: accept: %s\n",
407 if (s->parent->interactive) {
408 smbd_process(ev, sconn);
409 exit_server_cleanly("end of interactive mode");
413 if (!allowable_number_of_smbd_processes()) {
420 * Generate a unique id in the parent process so that we use
421 * the global random state in the parent.
423 generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
427 NTSTATUS status = NT_STATUS_OK;
432 set_my_unique_id(unique_id);
434 /* Stop zombies, the parent explicitly handles
435 * them, counting worker smbds. */
438 /* close our standard file
440 if (!debug_get_output_is_stdout()) {
441 close_low_fds(False); /* Don't close stderr */
445 * Can't use TALLOC_FREE here. Nulling out the argument to it
446 * would overwrite memory we've just freed.
448 talloc_free(s->parent);
451 status = reinit_after_fork(msg_ctx,
455 if (!NT_STATUS_IS_OK(status)) {
456 if (NT_STATUS_EQUAL(status,
457 NT_STATUS_TOO_MANY_OPENED_FILES)) {
458 DEBUG(0,("child process cannot initialize "
459 "because too many files are open\n"));
462 if (lp_clustering() &&
463 NT_STATUS_EQUAL(status,
464 NT_STATUS_INTERNAL_DB_ERROR)) {
465 DEBUG(1,("child process cannot initialize "
466 "because connection to CTDB "
471 DEBUG(0,("reinit_after_fork() failed\n"));
472 smb_panic("reinit_after_fork() failed");
475 smbd_setup_sig_term_handler();
476 smbd_setup_sig_hup_handler(ev,
479 if (!serverid_register(procid_self(),
480 FLAG_MSG_GENERAL|FLAG_MSG_SMBD
482 |FLAG_MSG_PRINT_GENERAL)) {
483 exit_server_cleanly("Could not register myself in "
487 smbd_process(ev, sconn);
489 exit_server_cleanly("end of child");
494 DEBUG(0,("smbd_accept_connection: sys_fork() failed: %s\n",
498 /* The parent doesn't need this socket */
501 /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
502 Clear the closed fd info out of server_fd --
503 and more importantly, out of client_fd in
504 util_sock.c, to avoid a possible
505 getpeername failure if we reopen the logs
506 and use %I in the filename.
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
528 force_check_log_size();
531 static bool smbd_open_one_socket(struct smbd_parent_context *parent,
532 struct tevent_context *ev_ctx,
533 struct messaging_context *msg_ctx,
534 const struct sockaddr_storage *ifss,
537 struct smbd_open_socket *s;
539 s = talloc(parent, struct smbd_open_socket);
545 s->fd = open_socket_in(SOCK_STREAM,
547 parent->sockets == NULL ? 0 : 2,
551 DEBUG(0,("smbd_open_once_socket: open_socket_in: "
552 "%s\n", strerror(errno)));
555 * We ignore an error here, as we've done before
560 /* ready to listen */
561 set_socket_options(s->fd, "SO_KEEPALIVE");
562 set_socket_options(s->fd, lp_socket_options());
564 /* Set server socket to
565 * non-blocking for the accept. */
566 set_blocking(s->fd, False);
568 if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
569 DEBUG(0,("open_sockets_smbd: listen: "
570 "%s\n", strerror(errno)));
576 s->msg_ctx = msg_ctx;
577 s->fde = tevent_add_fd(ev_ctx,
579 s->fd, TEVENT_FD_READ,
580 smbd_accept_connection,
583 DEBUG(0,("open_sockets_smbd: "
584 "tevent_add_fd: %s\n",
590 tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
592 DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
597 /****************************************************************************
598 Open the socket communication.
599 ****************************************************************************/
601 static bool open_sockets_smbd(struct smbd_parent_context *parent,
602 struct tevent_context *ev_ctx,
603 struct messaging_context *msg_ctx,
604 const char *smb_ports)
606 int num_interfaces = iface_count();
609 unsigned dns_port = 0;
616 smbd_setup_sig_chld_handler(ev_ctx);
618 /* use a reasonable default set of ports - listing on 445 and 139 */
620 ports = lp_smb_ports();
621 if (!ports || !*ports) {
622 ports = talloc_strdup(talloc_tos(), SMB_PORTS);
624 ports = talloc_strdup(talloc_tos(), ports);
627 ports = talloc_strdup(talloc_tos(), smb_ports);
630 if (lp_interfaces() && lp_bind_interfaces_only()) {
631 /* We have been given an interfaces line, and been
632 told to only bind to those interfaces. Create a
633 socket per interface and bind to only these.
636 /* Now open a listen socket for each of the
638 for(i = 0; i < num_interfaces; i++) {
639 const struct sockaddr_storage *ifss =
640 iface_n_sockaddr_storage(i);
645 DEBUG(0,("open_sockets_smbd: "
646 "interface %d has NULL IP address !\n",
652 next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
653 unsigned port = atoi(tok);
654 if (port == 0 || port > 0xffff) {
658 /* Keep the first port for mDNS service
665 if (!smbd_open_one_socket(parent,
675 /* Just bind to 0.0.0.0 - accept connections
680 const char *sock_addr = lp_socket_address();
682 const char *sock_ptr;
684 if (strequal(sock_addr, "0.0.0.0") ||
685 strequal(sock_addr, "::")) {
687 sock_addr = "::,0.0.0.0";
689 sock_addr = "0.0.0.0";
693 for (sock_ptr=sock_addr;
694 next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
695 for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) {
696 struct sockaddr_storage ss;
698 unsigned port = atoi(tok);
699 if (port == 0 || port > 0xffff) {
703 /* Keep the first port for mDNS service
710 /* open an incoming socket */
711 if (!interpret_string_addr(&ss, sock_tok,
712 AI_NUMERICHOST|AI_PASSIVE)) {
716 if (!smbd_open_one_socket(parent,
727 if (parent->sockets == NULL) {
728 DEBUG(0,("open_sockets_smbd: No "
729 "sockets available to bind to.\n"));
733 /* Setup the main smbd so that we can get messages. Note that
734 do this after starting listening. This is needed as when in
735 clustered mode, ctdb won't allow us to start doing database
736 operations until it has gone thru a full startup, which
737 includes checking to see that smbd is listening. */
739 if (!serverid_register(procid_self(),
740 FLAG_MSG_GENERAL|FLAG_MSG_SMBD
742 DEBUG(0, ("open_sockets_smbd: Failed to register "
743 "myself in serverid.tdb\n"));
747 /* Listen to messages */
749 messaging_register(msg_ctx, NULL, MSG_SMB_SAM_SYNC, msg_sam_sync);
750 messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server);
751 messaging_register(msg_ctx, NULL, MSG_SMB_FILE_RENAME,
752 msg_file_was_renamed);
753 messaging_register(msg_ctx, ev_ctx, MSG_SMB_CONF_UPDATED,
755 messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE,
756 smb_stat_cache_delete);
757 messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug);
758 messaging_register(msg_ctx, ev_ctx, MSG_PRINTER_PCAP,
760 brl_register_msgs(msg_ctx);
762 id_cache_register_msgs(msg_ctx);
763 id_cache_register_kill_msg(msg_ctx);
765 #ifdef CLUSTER_SUPPORT
766 if (lp_clustering()) {
767 ctdbd_register_reconfigure(messaging_ctdbd_connection());
772 messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT,
776 if (lp_multicast_dns_register() && (dns_port != 0)) {
777 #ifdef WITH_DNSSD_SUPPORT
778 smbd_setup_mdns_registration(ev_ctx,
781 #ifdef WITH_AVAHI_SUPPORT
784 avahi_conn = avahi_start_register(ev_ctx,
787 if (avahi_conn == NULL) {
788 DEBUG(10, ("avahi_start_register failed\n"));
796 static void smbd_parent_loop(struct tevent_context *ev_ctx,
797 struct smbd_parent_context *parent)
799 /* now accept incoming connections - forking a new process
800 for each incoming connection */
801 DEBUG(2,("waiting for connections\n"));
804 TALLOC_CTX *frame = talloc_stackframe();
806 ret = tevent_loop_once(ev_ctx);
808 exit_server_cleanly("tevent_loop_once() error");
814 /* NOTREACHED return True; */
818 /****************************************************************************
819 Initialise connect, service and file structs.
820 ****************************************************************************/
822 static bool init_structs(void )
825 * Set the machine NETBIOS name if not already
826 * set from the config file.
838 /****************************************************************************
840 ****************************************************************************/
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. */
846 extern void build_options(bool screen);
848 int main(int argc,const char *argv[])
850 /* shall I run as a daemon */
851 bool is_daemon = false;
852 bool interactive = false;
854 bool no_process_group = false;
855 bool log_stdout = false;
857 char *profile_level = NULL;
860 bool print_build_options = False;
865 OPT_NO_PROCESS_GROUP,
868 struct poptOption long_options[] = {
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"},
879 POPT_COMMON_DYNCONFIG
882 struct smbd_parent_context *parent = NULL;
886 struct tevent_context *ev_ctx;
887 struct messaging_context *msg_ctx;
890 * Do this before any other talloc operation
892 talloc_enable_null_tracking();
893 frame = talloc_stackframe();
895 setup_logging(argv[0], DEBUG_DEFAULT_STDOUT);
903 #ifdef HAVE_SET_AUTH_PARAMETERS
904 set_auth_parameters(argc,argv);
907 pc = poptGetContext("smbd", argc, argv, long_options, 0);
908 while((opt = poptGetNextOpt(pc)) != -1) {
913 case OPT_INTERACTIVE:
919 case OPT_NO_PROCESS_GROUP:
920 no_process_group = true;
926 print_build_options = True;
929 d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
930 poptBadOption(pc, 0), poptStrerror(opt));
931 poptPrintUsage(pc, stderr, 0);
943 setup_logging(argv[0], DEBUG_STDOUT);
945 setup_logging(argv[0], DEBUG_FILE);
948 if (print_build_options) {
949 build_options(True); /* Display output to screen as well as debug */
954 /* needed for SecureWare on SCO */
958 set_remote_machine_name("smbd", False);
960 if (interactive && (DEBUGLEVEL >= 9)) {
961 talloc_enable_leak_report();
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"));
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);
973 /* get initial effective uid and gid */
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();
982 dump_core_setup("smbd", lp_logfile());
984 /* we are never interested in SIGPIPE */
985 BlockSignals(True,SIGPIPE);
988 /* we are never interested in SIGFPE */
989 BlockSignals(True,SIGFPE);
993 /* We are no longer interested in USR2 */
994 BlockSignals(True,SIGUSR2);
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);
1003 /* Ensure we leave no zombies until we
1004 * correctly set up child handling below. */
1008 /* we want total control over the permissions on created files,
1009 so set our umask to 0 */
1014 DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1015 DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1017 DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1018 (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1020 /* Output the build options to the debug log */
1021 build_options(False);
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"));
1028 if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1029 DEBUG(0, ("error opening config file '%s'\n", get_dyn_CONFIGFILE()));
1033 /* Init the security context and global current_user */
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()
1042 ev_ctx = server_event_context();
1043 if (ev_ctx == NULL) {
1048 * Init the messaging context
1049 * FIXME: This should only call messaging_init()
1051 msg_ctx = server_messaging_context();
1052 if (msg_ctx == NULL) {
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.
1060 if (!reload_services(NULL, -1, False)) {
1064 /* ...NOTE... Log files are working from this point! */
1066 DEBUG(3,("loaded services\n"));
1071 if (!profile_setup(msg_ctx, False)) {
1072 DEBUG(0,("ERROR: failed to setup profiling\n"));
1075 if (profile_level != NULL) {
1076 int pl = atoi(profile_level);
1077 struct server_id src;
1079 DEBUG(1, ("setting profiling level: %s\n",profile_level));
1081 set_profile_level(pl, src);
1085 if (!is_daemon && !is_a_socket(0)) {
1087 DEBUG(0,("standard input is not a socket, assuming -D option\n"));
1090 * Setting is_daemon here prevents us from eventually calling
1091 * the open_sockets_inetd()
1097 if (is_daemon && !interactive) {
1098 DEBUG( 3, ( "Becoming a daemon.\n" ) );
1099 become_daemon(Fork, no_process_group, log_stdout);
1102 generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
1103 set_my_unique_id(unique_id);
1107 * If we're interactive we want to set our own process group for
1108 * signal management.
1110 if (interactive && !no_process_group)
1111 setpgid( (pid_t)0, (pid_t)0);
1114 if (!directory_exist(lp_lockdir()))
1115 mkdir(lp_lockdir(), 0755);
1118 pidfile_create("smbd");
1120 status = reinit_after_fork(msg_ctx,
1122 procid_self(), false);
1123 if (!NT_STATUS_IS_OK(status)) {
1124 DEBUG(0,("reinit_after_fork() failed\n"));
1128 smbd_server_conn->msg_ctx = msg_ctx;
1130 smbd_setup_sig_term_handler();
1131 smbd_setup_sig_hup_handler(ev_ctx,
1134 /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1136 if (smbd_memcache() == NULL) {
1140 memcache_set_global(smbd_memcache());
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 */
1145 if(!initialize_password_db(false, ev_ctx))
1148 if (!secrets_init()) {
1149 DEBUG(0, ("ERROR: smbd can not open secrets.tdb\n"));
1153 if (lp_server_role() == ROLE_DOMAIN_BDC || lp_server_role() == ROLE_DOMAIN_PDC) {
1154 if (!open_schannel_session_store(NULL, lp_private_dir())) {
1155 DEBUG(0,("ERROR: Samba cannot open schannel store for secured NETLOGON operations.\n"));
1160 if(!get_global_sam_sid()) {
1161 DEBUG(0,("ERROR: Samba cannot create a SAM SID.\n"));
1165 if (!sessionid_init()) {
1169 if (!connections_init(True))
1172 if (!locking_init())
1175 if (!messaging_tdb_parent_init(ev_ctx)) {
1179 if (!notify_internal_parent_init(ev_ctx)) {
1183 if (!serverid_parent_init(ev_ctx)) {
1187 if (!W_ERROR_IS_OK(registry_init_full()))
1190 /* Open the share_info.tdb here, so we don't have to open
1191 after the fork on every single connection. This is a small
1192 performance improvment and reduces the total number of system
1194 if (!share_info_db_init()) {
1195 DEBUG(0,("ERROR: failed to load share info db.\n"));
1199 status = init_system_info();
1200 if (!NT_STATUS_IS_OK(status)) {
1201 DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
1202 nt_errstr(status)));
1206 if (!init_guest_info()) {
1207 DEBUG(0,("ERROR: failed to setup guest info.\n"));
1211 if (!file_init(smbd_server_conn)) {
1212 DEBUG(0, ("ERROR: file_init failed\n"));
1216 /* This MUST be done before start_epmd() because otherwise
1217 * start_epmd() forks and races against dcesrv_ep_setup() to
1218 * call directory_create_or_exist() */
1219 if (!directory_create_or_exist(lp_ncalrpc_dir(), geteuid(), 0755)) {
1220 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
1221 lp_ncalrpc_dir(), strerror(errno)));
1225 if (is_daemon && !interactive) {
1226 if (rpc_epmapper_daemon() == RPC_DAEMON_FORK) {
1227 start_epmd(ev_ctx, msg_ctx);
1231 if (!dcesrv_ep_setup(ev_ctx, msg_ctx)) {
1235 /* only start other daemons if we are running as a daemon
1236 * -- bad things will happen if smbd is launched via inetd
1237 * and we fork a copy of ourselves here */
1238 if (is_daemon && !interactive) {
1240 if (rpc_lsasd_daemon() == RPC_DAEMON_FORK) {
1241 start_lsasd(ev_ctx, msg_ctx);
1244 if (!_lp_disable_spoolss() &&
1245 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
1246 bool bgq = lp_parm_bool(-1, "smbd", "backgroundqueue", true);
1248 if (!printing_subsystem_init(ev_ctx, msg_ctx, true, bgq)) {
1252 } else if (!_lp_disable_spoolss() &&
1253 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
1254 if (!printing_subsystem_init(ev_ctx, msg_ctx, false, false)) {
1263 /* Started from inetd. fd 0 is the socket. */
1264 /* We will abort gracefully when the client or remote system
1266 smbd_server_conn->sock = dup(0);
1268 /* close our standard file descriptors */
1269 if (!debug_get_output_is_stdout()) {
1270 close_low_fds(False); /* Don't close stderr */
1278 smbd_setup_sig_chld_handler(ev_ctx);
1280 smbd_process(ev_ctx, smbd_server_conn);
1282 exit_server_cleanly(NULL);
1286 parent = talloc_zero(ev_ctx, struct smbd_parent_context);
1288 exit_server("talloc(struct smbd_parent_context) failed");
1290 parent->interactive = interactive;
1292 if (!open_sockets_smbd(parent, ev_ctx, msg_ctx, ports))
1293 exit_server("open_sockets_smbd() failed");
1295 /* do a printer update now that all messaging has been set up,
1296 * before we allow clients to start connecting */
1297 printing_subsystem_update(ev_ctx, msg_ctx, false);
1300 /* make sure we always have a valid stackframe */
1301 frame = talloc_stackframe();
1303 smbd_parent_loop(ev_ctx, parent);
1305 exit_server_cleanly(NULL);