s3: smbd: VFS: Add vfs_stat_smb_basename() - to be called when we *know* stream name...
[Samba.git] / source3 / smbd / server.c
blob33f6201125cc45bb333f278325602f70dcdb2a2a
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
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/>.
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 "../lib/util/memcache.h"
33 #include "ctdbd_conn.h"
34 #include "util_cluster.h"
35 #include "printing/queue_process.h"
36 #include "rpc_server/rpc_service_setup.h"
37 #include "rpc_server/rpc_config.h"
38 #include "serverid.h"
39 #include "passdb.h"
40 #include "auth.h"
41 #include "messages.h"
42 #include "smbprofile.h"
43 #include "lib/id_cache.h"
44 #include "lib/param/param.h"
45 #include "lib/background.h"
46 #include "lib/conn_tdb.h"
47 #include "../lib/util/pidfile.h"
48 #include "lib/smbd_shim.h"
49 #include "scavenger.h"
50 #include "locking/leases_db.h"
52 struct smbd_open_socket;
53 struct smbd_child_pid;
55 struct smbd_parent_context {
56 bool interactive;
58 struct tevent_context *ev_ctx;
59 struct messaging_context *msg_ctx;
61 /* the list of listening sockets */
62 struct smbd_open_socket *sockets;
64 /* the list of current child processes */
65 struct smbd_child_pid *children;
66 size_t num_children;
68 struct tevent_timer *cleanup_te;
71 struct smbd_open_socket {
72 struct smbd_open_socket *prev, *next;
73 struct smbd_parent_context *parent;
74 int fd;
75 struct tevent_fd *fde;
78 struct smbd_child_pid {
79 struct smbd_child_pid *prev, *next;
80 pid_t pid;
83 extern void start_epmd(struct tevent_context *ev_ctx,
84 struct messaging_context *msg_ctx);
86 extern void start_lsasd(struct tevent_context *ev_ctx,
87 struct messaging_context *msg_ctx);
89 extern void start_fssd(struct tevent_context *ev_ctx,
90 struct messaging_context *msg_ctx);
92 #ifdef WITH_DFS
93 extern int dcelogin_atmost_once;
94 #endif /* WITH_DFS */
96 /*******************************************************************
97 What to do when smb.conf is updated.
98 ********************************************************************/
100 static void smbd_parent_conf_updated(struct messaging_context *msg,
101 void *private_data,
102 uint32_t msg_type,
103 struct server_id server_id,
104 DATA_BLOB *data)
106 struct tevent_context *ev_ctx =
107 talloc_get_type_abort(private_data, struct tevent_context);
109 DEBUG(10,("smbd_parent_conf_updated: Got message saying smb.conf was "
110 "updated. Reloading.\n"));
111 change_to_root_user();
112 reload_services(NULL, NULL, false);
113 printing_subsystem_update(ev_ctx, msg, false);
116 /*******************************************************************
117 Delete a statcache entry.
118 ********************************************************************/
120 static void smb_stat_cache_delete(struct messaging_context *msg,
121 void *private_data,
122 uint32_t msg_tnype,
123 struct server_id server_id,
124 DATA_BLOB *data)
126 const char *name = (const char *)data->data;
127 DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
128 stat_cache_delete(name);
131 /****************************************************************************
132 Send a SIGTERM to our process group.
133 *****************************************************************************/
135 static void killkids(void)
137 if(am_parent) kill(0,SIGTERM);
140 static void msg_exit_server(struct messaging_context *msg,
141 void *private_data,
142 uint32_t msg_type,
143 struct server_id server_id,
144 DATA_BLOB *data)
146 DEBUG(3, ("got a SHUTDOWN message\n"));
147 exit_server_cleanly(NULL);
150 #ifdef DEVELOPER
151 static void msg_inject_fault(struct messaging_context *msg,
152 void *private_data,
153 uint32_t msg_type,
154 struct server_id src,
155 DATA_BLOB *data)
157 int sig;
158 struct server_id_buf tmp;
160 if (data->length != sizeof(sig)) {
161 DEBUG(0, ("Process %s sent bogus signal injection request\n",
162 server_id_str_buf(src, &tmp)));
163 return;
166 sig = *(int *)data->data;
167 if (sig == -1) {
168 exit_server("internal error injected");
169 return;
172 #if HAVE_STRSIGNAL
173 DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
174 server_id_str_buf(src, &tmp), sig, strsignal(sig)));
175 #else
176 DEBUG(0, ("Process %s requested injection of signal %d\n",
177 server_id_str_buf(src, &tmp), sig));
178 #endif
180 kill(getpid(), sig);
182 #endif /* DEVELOPER */
184 static NTSTATUS messaging_send_to_children(struct messaging_context *msg_ctx,
185 uint32_t msg_type, DATA_BLOB* data)
187 NTSTATUS status;
188 struct smbd_parent_context *parent = am_parent;
189 struct smbd_child_pid *child;
191 if (parent == NULL) {
192 return NT_STATUS_INTERNAL_ERROR;
195 for (child = parent->children; child != NULL; child = child->next) {
196 status = messaging_send(parent->msg_ctx,
197 pid_to_procid(child->pid),
198 msg_type, data);
199 if (!NT_STATUS_IS_OK(status)) {
200 return status;
203 return NT_STATUS_OK;
206 static void smb_parent_send_to_children(struct messaging_context *ctx,
207 void* data,
208 uint32_t msg_type,
209 struct server_id srv_id,
210 DATA_BLOB* msg_data)
212 messaging_send_to_children(ctx, msg_type, msg_data);
216 * Parent smbd process sets its own debug level first and then
217 * sends a message to all the smbd children to adjust their debug
218 * level to that of the parent.
221 static void smbd_msg_debug(struct messaging_context *msg_ctx,
222 void *private_data,
223 uint32_t msg_type,
224 struct server_id server_id,
225 DATA_BLOB *data)
227 debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
229 messaging_send_to_children(msg_ctx, MSG_DEBUG, data);
232 static void smbd_parent_id_cache_kill(struct messaging_context *msg_ctx,
233 void *private_data,
234 uint32_t msg_type,
235 struct server_id server_id,
236 DATA_BLOB* data)
238 const char *msg = (data && data->data)
239 ? (const char *)data->data : "<NULL>";
240 struct id_cache_ref id;
242 if (!id_cache_ref_parse(msg, &id)) {
243 DEBUG(0, ("Invalid ?ID: %s\n", msg));
244 return;
247 id_cache_delete_from_cache(&id);
249 messaging_send_to_children(msg_ctx, msg_type, data);
252 static void smbd_parent_id_cache_delete(struct messaging_context *ctx,
253 void* data,
254 uint32_t msg_type,
255 struct server_id srv_id,
256 DATA_BLOB* msg_data)
258 id_cache_delete_message(ctx, data, msg_type, srv_id, msg_data);
260 messaging_send_to_children(ctx, msg_type, msg_data);
263 struct smbd_parent_notify_state {
264 struct tevent_context *ev;
265 struct messaging_context *msg;
266 uint32_t msgtype;
267 struct notify_context *notify;
270 static int smbd_parent_notify_cleanup(void *private_data);
271 static void smbd_parent_notify_cleanup_done(struct tevent_req *req);
272 static void smbd_parent_notify_proxy_done(struct tevent_req *req);
274 static bool smbd_parent_notify_init(TALLOC_CTX *mem_ctx,
275 struct messaging_context *msg,
276 struct tevent_context *ev)
278 struct smbd_parent_notify_state *state;
279 struct tevent_req *req;
281 state = talloc(mem_ctx, struct smbd_parent_notify_state);
282 if (state == NULL) {
283 return false;
285 state->msg = msg;
286 state->ev = ev;
287 state->msgtype = MSG_SMB_NOTIFY_CLEANUP;
289 state->notify = notify_init(state, msg, ev);
290 if (state->notify == NULL) {
291 goto fail;
293 req = background_job_send(
294 state, state->ev, state->msg, &state->msgtype, 1,
295 lp_parm_int(-1, "smbd", "notify cleanup interval", 60),
296 smbd_parent_notify_cleanup, state->notify);
297 if (req == NULL) {
298 goto fail;
300 tevent_req_set_callback(req, smbd_parent_notify_cleanup_done, state);
302 if (!lp_clustering()) {
303 return true;
306 req = notify_cluster_proxy_send(state, ev, state->notify);
307 if (req == NULL) {
308 goto fail;
310 tevent_req_set_callback(req, smbd_parent_notify_proxy_done, state);
312 return true;
313 fail:
314 TALLOC_FREE(state);
315 return false;
318 static int smbd_parent_notify_cleanup(void *private_data)
320 struct notify_context *notify = talloc_get_type_abort(
321 private_data, struct notify_context);
322 notify_cleanup(notify);
323 return lp_parm_int(-1, "smbd", "notify cleanup interval", 60);
326 static void smbd_parent_notify_cleanup_done(struct tevent_req *req)
328 struct smbd_parent_notify_state *state = tevent_req_callback_data(
329 req, struct smbd_parent_notify_state);
330 NTSTATUS status;
332 status = background_job_recv(req);
333 TALLOC_FREE(req);
334 DEBUG(1, ("notify cleanup job ended with %s\n", nt_errstr(status)));
337 * Provide self-healing: Whatever the error condition was, it
338 * will have printed it into log.smbd. Just retrying and
339 * spamming log.smbd once a minute should be fine.
341 req = background_job_send(
342 state, state->ev, state->msg, &state->msgtype, 1, 60,
343 smbd_parent_notify_cleanup, state->notify);
344 if (req == NULL) {
345 DEBUG(1, ("background_job_send failed\n"));
346 return;
348 tevent_req_set_callback(req, smbd_parent_notify_cleanup_done, state);
351 static void smbd_parent_notify_proxy_done(struct tevent_req *req)
353 int ret;
355 ret = notify_cluster_proxy_recv(req);
356 TALLOC_FREE(req);
357 DEBUG(1, ("notify proxy job ended with %s\n", strerror(ret)));
360 static void add_child_pid(struct smbd_parent_context *parent,
361 pid_t pid)
363 struct smbd_child_pid *child;
365 child = talloc_zero(parent, struct smbd_child_pid);
366 if (child == NULL) {
367 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
368 return;
370 child->pid = pid;
371 DLIST_ADD(parent->children, child);
372 parent->num_children += 1;
375 static void smb_tell_num_children(struct messaging_context *ctx, void *data,
376 uint32_t msg_type, struct server_id srv_id,
377 DATA_BLOB *msg_data)
379 uint8_t buf[sizeof(uint32_t)];
381 if (am_parent) {
382 SIVAL(buf, 0, am_parent->num_children);
383 messaging_send_buf(ctx, srv_id, MSG_SMB_NUM_CHILDREN,
384 buf, sizeof(buf));
390 at most every smbd:cleanuptime seconds (default 20), we scan the BRL
391 and locking database for entries to cleanup. As a side effect this
392 also cleans up dead entries in the connections database (due to the
393 traversal in message_send_all()
395 Using a timer for this prevents a flood of traversals when a large
396 number of clients disconnect at the same time (perhaps due to a
397 network outage).
400 static void cleanup_timeout_fn(struct tevent_context *event_ctx,
401 struct tevent_timer *te,
402 struct timeval now,
403 void *private_data)
405 struct smbd_parent_context *parent =
406 talloc_get_type_abort(private_data,
407 struct smbd_parent_context);
409 parent->cleanup_te = NULL;
411 DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
412 message_send_all(parent->msg_ctx, MSG_SMB_UNLOCK, NULL, 0, NULL);
413 messaging_send_buf(parent->msg_ctx,
414 messaging_server_id(parent->msg_ctx),
415 MSG_SMB_BRL_VALIDATE, NULL, 0);
418 static void remove_child_pid(struct smbd_parent_context *parent,
419 pid_t pid,
420 bool unclean_shutdown)
422 struct smbd_child_pid *child;
423 struct server_id child_id;
424 int ret;
426 child_id = pid_to_procid(pid);
428 ret = messaging_cleanup(parent->msg_ctx, pid);
430 if ((ret != 0) && (ret != ENOENT)) {
431 DEBUG(10, ("%s: messaging_cleanup returned %s\n",
432 __func__, strerror(ret)));
435 smbprofile_cleanup(pid);
437 for (child = parent->children; child != NULL; child = child->next) {
438 if (child->pid == pid) {
439 struct smbd_child_pid *tmp = child;
440 DLIST_REMOVE(parent->children, child);
441 TALLOC_FREE(tmp);
442 parent->num_children -= 1;
443 break;
447 if (child == NULL) {
448 /* not all forked child processes are added to the children list */
449 DEBUG(2, ("Could not find child %d -- ignoring\n", (int)pid));
450 return;
453 if (unclean_shutdown) {
454 /* a child terminated uncleanly so tickle all
455 processes to see if they can grab any of the
456 pending locks
458 DEBUG(3,(__location__ " Unclean shutdown of pid %u\n",
459 (unsigned int)pid));
460 if (parent->cleanup_te == NULL) {
461 /* call the cleanup timer, but not too often */
462 int cleanup_time = lp_parm_int(-1, "smbd", "cleanuptime", 20);
463 parent->cleanup_te = tevent_add_timer(parent->ev_ctx,
464 parent,
465 timeval_current_ofs(cleanup_time, 0),
466 cleanup_timeout_fn,
467 parent);
468 DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
472 if (!serverid_deregister(child_id)) {
473 DEBUG(1, ("Could not remove pid %d from serverid.tdb\n",
474 (int)pid));
478 /****************************************************************************
479 Have we reached the process limit ?
480 ****************************************************************************/
482 static bool allowable_number_of_smbd_processes(struct smbd_parent_context *parent)
484 int max_processes = lp_max_smbd_processes();
486 if (!max_processes)
487 return True;
489 return parent->num_children < max_processes;
492 static void smbd_sig_chld_handler(struct tevent_context *ev,
493 struct tevent_signal *se,
494 int signum,
495 int count,
496 void *siginfo,
497 void *private_data)
499 pid_t pid;
500 int status;
501 struct smbd_parent_context *parent =
502 talloc_get_type_abort(private_data,
503 struct smbd_parent_context);
505 while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
506 bool unclean_shutdown = False;
508 /* If the child terminated normally, assume
509 it was an unclean shutdown unless the
510 status is 0
512 if (WIFEXITED(status)) {
513 unclean_shutdown = WEXITSTATUS(status);
515 /* If the child terminated due to a signal
516 we always assume it was unclean.
518 if (WIFSIGNALED(status)) {
519 unclean_shutdown = True;
521 remove_child_pid(parent, pid, unclean_shutdown);
525 static void smbd_setup_sig_chld_handler(struct smbd_parent_context *parent)
527 struct tevent_signal *se;
529 se = tevent_add_signal(parent->ev_ctx,
530 parent, /* mem_ctx */
531 SIGCHLD, 0,
532 smbd_sig_chld_handler,
533 parent);
534 if (!se) {
535 exit_server("failed to setup SIGCHLD handler");
539 static void smbd_open_socket_close_fn(struct tevent_context *ev,
540 struct tevent_fd *fde,
541 int fd,
542 void *private_data)
544 /* this might be the socket_wrapper swrap_close() */
545 close(fd);
548 static void smbd_accept_connection(struct tevent_context *ev,
549 struct tevent_fd *fde,
550 uint16_t flags,
551 void *private_data)
553 struct smbd_open_socket *s = talloc_get_type_abort(private_data,
554 struct smbd_open_socket);
555 struct messaging_context *msg_ctx = s->parent->msg_ctx;
556 struct sockaddr_storage addr;
557 socklen_t in_addrlen = sizeof(addr);
558 int fd;
559 pid_t pid = 0;
560 uint64_t unique_id;
562 fd = accept(s->fd, (struct sockaddr *)(void *)&addr,&in_addrlen);
563 if (fd == -1 && errno == EINTR)
564 return;
566 if (fd == -1) {
567 DEBUG(0,("accept: %s\n",
568 strerror(errno)));
569 return;
572 if (s->parent->interactive) {
573 reinit_after_fork(msg_ctx, ev, true);
574 smbd_process(ev, msg_ctx, fd, true);
575 exit_server_cleanly("end of interactive mode");
576 return;
579 if (!allowable_number_of_smbd_processes(s->parent)) {
580 close(fd);
581 return;
585 * Generate a unique id in the parent process so that we use
586 * the global random state in the parent.
588 unique_id = serverid_get_random_unique_id();
590 pid = fork();
591 if (pid == 0) {
592 NTSTATUS status = NT_STATUS_OK;
595 * Can't use TALLOC_FREE here. Nulling out the argument to it
596 * would overwrite memory we've just freed.
598 talloc_free(s->parent);
599 s = NULL;
601 set_my_unique_id(unique_id);
603 /* Stop zombies, the parent explicitly handles
604 * them, counting worker smbds. */
605 CatchChild();
607 status = smbd_reinit_after_fork(msg_ctx, ev, true);
608 if (!NT_STATUS_IS_OK(status)) {
609 if (NT_STATUS_EQUAL(status,
610 NT_STATUS_TOO_MANY_OPENED_FILES)) {
611 DEBUG(0,("child process cannot initialize "
612 "because too many files are open\n"));
613 goto exit;
615 if (lp_clustering() &&
616 NT_STATUS_EQUAL(status,
617 NT_STATUS_INTERNAL_DB_ERROR)) {
618 DEBUG(1,("child process cannot initialize "
619 "because connection to CTDB "
620 "has failed\n"));
621 goto exit;
624 DEBUG(0,("reinit_after_fork() failed\n"));
625 smb_panic("reinit_after_fork() failed");
628 smbd_process(ev, msg_ctx, fd, false);
629 exit:
630 exit_server_cleanly("end of child");
631 return;
634 if (pid < 0) {
635 DEBUG(0,("smbd_accept_connection: fork() failed: %s\n",
636 strerror(errno)));
639 /* The parent doesn't need this socket */
640 close(fd);
642 /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
643 Clear the closed fd info out of server_fd --
644 and more importantly, out of client_fd in
645 util_sock.c, to avoid a possible
646 getpeername failure if we reopen the logs
647 and use %I in the filename.
650 if (pid != 0) {
651 add_child_pid(s->parent, pid);
654 /* Force parent to check log size after
655 * spawning child. Fix from
656 * klausr@ITAP.Physik.Uni-Stuttgart.De. The
657 * parent smbd will log to logserver.smb. It
658 * writes only two messages for each child
659 * started/finished. But each child writes,
660 * say, 50 messages also in logserver.smb,
661 * begining with the debug_count of the
662 * parent, before the child opens its own log
663 * file logserver.client. In a worst case
664 * scenario the size of logserver.smb would be
665 * checked after about 50*50=2500 messages
666 * (ca. 100kb).
667 * */
668 force_check_log_size();
671 static bool smbd_open_one_socket(struct smbd_parent_context *parent,
672 struct tevent_context *ev_ctx,
673 const struct sockaddr_storage *ifss,
674 uint16_t port)
676 struct smbd_open_socket *s;
678 s = talloc(parent, struct smbd_open_socket);
679 if (!s) {
680 return false;
683 s->parent = parent;
684 s->fd = open_socket_in(SOCK_STREAM,
685 port,
686 parent->sockets == NULL ? 0 : 2,
687 ifss,
688 true);
689 if (s->fd == -1) {
690 DEBUG(0,("smbd_open_once_socket: open_socket_in: "
691 "%s\n", strerror(errno)));
692 TALLOC_FREE(s);
694 * We ignore an error here, as we've done before
696 return true;
699 /* ready to listen */
700 set_socket_options(s->fd, "SO_KEEPALIVE");
701 set_socket_options(s->fd, lp_socket_options());
703 /* Set server socket to
704 * non-blocking for the accept. */
705 set_blocking(s->fd, False);
707 if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
708 DEBUG(0,("open_sockets_smbd: listen: "
709 "%s\n", strerror(errno)));
710 close(s->fd);
711 TALLOC_FREE(s);
712 return false;
715 s->fde = tevent_add_fd(ev_ctx,
717 s->fd, TEVENT_FD_READ,
718 smbd_accept_connection,
720 if (!s->fde) {
721 DEBUG(0,("open_sockets_smbd: "
722 "tevent_add_fd: %s\n",
723 strerror(errno)));
724 close(s->fd);
725 TALLOC_FREE(s);
726 return false;
728 tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
730 DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
732 return true;
735 /****************************************************************************
736 Open the socket communication.
737 ****************************************************************************/
739 static bool open_sockets_smbd(struct smbd_parent_context *parent,
740 struct tevent_context *ev_ctx,
741 struct messaging_context *msg_ctx,
742 const char *smb_ports)
744 int num_interfaces = iface_count();
745 int i,j;
746 const char **ports;
747 unsigned dns_port = 0;
749 #ifdef HAVE_ATEXIT
750 atexit(killkids);
751 #endif
753 /* Stop zombies */
754 smbd_setup_sig_chld_handler(parent);
756 ports = lp_smb_ports();
758 /* use a reasonable default set of ports - listing on 445 and 139 */
759 if (smb_ports) {
760 char **l;
761 l = str_list_make_v3(talloc_tos(), smb_ports, NULL);
762 ports = discard_const_p(const char *, l);
765 for (j = 0; ports && ports[j]; j++) {
766 unsigned port = atoi(ports[j]);
768 if (port == 0 || port > 0xffff) {
769 exit_server_cleanly("Invalid port in the config or on "
770 "the commandline specified!");
774 if (lp_interfaces() && lp_bind_interfaces_only()) {
775 /* We have been given an interfaces line, and been
776 told to only bind to those interfaces. Create a
777 socket per interface and bind to only these.
780 /* Now open a listen socket for each of the
781 interfaces. */
782 for(i = 0; i < num_interfaces; i++) {
783 const struct sockaddr_storage *ifss =
784 iface_n_sockaddr_storage(i);
785 if (ifss == NULL) {
786 DEBUG(0,("open_sockets_smbd: "
787 "interface %d has NULL IP address !\n",
788 i));
789 continue;
792 for (j = 0; ports && ports[j]; j++) {
793 unsigned port = atoi(ports[j]);
795 /* Keep the first port for mDNS service
796 * registration.
798 if (dns_port == 0) {
799 dns_port = port;
802 if (!smbd_open_one_socket(parent,
803 ev_ctx,
804 ifss,
805 port)) {
806 return false;
810 } else {
811 /* Just bind to 0.0.0.0 - accept connections
812 from anywhere. */
814 const char *sock_addr;
815 char *sock_tok;
816 const char *sock_ptr;
818 #if HAVE_IPV6
819 sock_addr = "::,0.0.0.0";
820 #else
821 sock_addr = "0.0.0.0";
822 #endif
824 for (sock_ptr=sock_addr;
825 next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
826 for (j = 0; ports && ports[j]; j++) {
827 struct sockaddr_storage ss;
828 unsigned port = atoi(ports[j]);
830 /* Keep the first port for mDNS service
831 * registration.
833 if (dns_port == 0) {
834 dns_port = port;
837 /* open an incoming socket */
838 if (!interpret_string_addr(&ss, sock_tok,
839 AI_NUMERICHOST|AI_PASSIVE)) {
840 continue;
844 * If we fail to open any sockets
845 * in this loop the parent-sockets == NULL
846 * case below will prevent us from starting.
849 (void)smbd_open_one_socket(parent,
850 ev_ctx,
851 &ss,
852 port);
857 if (parent->sockets == NULL) {
858 DEBUG(0,("open_sockets_smbd: No "
859 "sockets available to bind to.\n"));
860 return false;
863 /* Setup the main smbd so that we can get messages. Note that
864 do this after starting listening. This is needed as when in
865 clustered mode, ctdb won't allow us to start doing database
866 operations until it has gone thru a full startup, which
867 includes checking to see that smbd is listening. */
869 if (!serverid_register(messaging_server_id(msg_ctx),
870 FLAG_MSG_GENERAL|FLAG_MSG_SMBD
871 |FLAG_MSG_PRINT_GENERAL
872 |FLAG_MSG_DBWRAP)) {
873 DEBUG(0, ("open_sockets_smbd: Failed to register "
874 "myself in serverid.tdb\n"));
875 return false;
878 /* Listen to messages */
880 messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server);
881 messaging_register(msg_ctx, ev_ctx, MSG_SMB_CONF_UPDATED,
882 smbd_parent_conf_updated);
883 messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE,
884 smb_stat_cache_delete);
885 messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug);
886 messaging_register(msg_ctx, NULL, MSG_SMB_BRL_VALIDATE,
887 brl_revalidate);
888 messaging_register(msg_ctx, NULL, MSG_SMB_FORCE_TDIS,
889 smb_parent_send_to_children);
890 messaging_register(msg_ctx, NULL, MSG_SMB_KILL_CLIENT_IP,
891 smb_parent_send_to_children);
892 messaging_register(msg_ctx, NULL, MSG_SMB_TELL_NUM_CHILDREN,
893 smb_tell_num_children);
895 messaging_register(msg_ctx, NULL,
896 ID_CACHE_DELETE, smbd_parent_id_cache_delete);
897 messaging_register(msg_ctx, NULL,
898 ID_CACHE_KILL, smbd_parent_id_cache_kill);
900 if (lp_clustering()) {
901 ctdbd_register_reconfigure(messaging_ctdbd_connection());
904 #ifdef DEVELOPER
905 messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT,
906 msg_inject_fault);
907 #endif
909 if (lp_multicast_dns_register() && (dns_port != 0)) {
910 #ifdef WITH_DNSSD_SUPPORT
911 smbd_setup_mdns_registration(ev_ctx,
912 parent, dns_port);
913 #endif
914 #ifdef WITH_AVAHI_SUPPORT
915 void *avahi_conn;
917 avahi_conn = avahi_start_register(ev_ctx,
918 ev_ctx,
919 dns_port);
920 if (avahi_conn == NULL) {
921 DEBUG(10, ("avahi_start_register failed\n"));
923 #endif
926 return true;
931 handle stdin becoming readable when we are in --foreground mode
933 static void smbd_stdin_handler(struct tevent_context *ev,
934 struct tevent_fd *fde,
935 uint16_t flags,
936 void *private_data)
938 char c;
939 if (read(0, &c, 1) != 1) {
940 /* we have reached EOF on stdin, which means the
941 parent has exited. Shutdown the server */
942 exit_server_cleanly("EOF on stdin");
946 struct smbd_parent_tevent_trace_state {
947 TALLOC_CTX *frame;
950 static void smbd_parent_tevent_trace_callback(enum tevent_trace_point point,
951 void *private_data)
953 struct smbd_parent_tevent_trace_state *state =
954 (struct smbd_parent_tevent_trace_state *)private_data;
956 switch (point) {
957 case TEVENT_TRACE_BEFORE_WAIT:
958 break;
959 case TEVENT_TRACE_AFTER_WAIT:
960 break;
961 case TEVENT_TRACE_BEFORE_LOOP_ONCE:
962 TALLOC_FREE(state->frame);
963 state->frame = talloc_stackframe();
964 break;
965 case TEVENT_TRACE_AFTER_LOOP_ONCE:
966 TALLOC_FREE(state->frame);
967 break;
970 errno = 0;
973 static void smbd_parent_loop(struct tevent_context *ev_ctx,
974 struct smbd_parent_context *parent)
976 struct smbd_parent_tevent_trace_state trace_state = {
977 .frame = NULL,
979 int ret = 0;
981 tevent_set_trace_callback(ev_ctx, smbd_parent_tevent_trace_callback,
982 &trace_state);
984 /* now accept incoming connections - forking a new process
985 for each incoming connection */
986 DEBUG(2,("waiting for connections\n"));
988 ret = tevent_loop_wait(ev_ctx);
989 if (ret != 0) {
990 DEBUG(0, ("tevent_loop_wait failed: %d, %s, exiting\n",
991 ret, strerror(errno)));
994 TALLOC_FREE(trace_state.frame);
996 /* NOTREACHED return True; */
1000 /****************************************************************************
1001 Initialise connect, service and file structs.
1002 ****************************************************************************/
1004 static bool init_structs(void )
1007 * Set the machine NETBIOS name if not already
1008 * set from the config file.
1011 if (!init_names())
1012 return False;
1014 if (!secrets_init())
1015 return False;
1017 return True;
1020 static void smbd_parent_sig_term_handler(struct tevent_context *ev,
1021 struct tevent_signal *se,
1022 int signum,
1023 int count,
1024 void *siginfo,
1025 void *private_data)
1027 exit_server_cleanly("termination signal");
1030 static void smbd_parent_sig_hup_handler(struct tevent_context *ev,
1031 struct tevent_signal *se,
1032 int signum,
1033 int count,
1034 void *siginfo,
1035 void *private_data)
1037 struct smbd_parent_context *parent =
1038 talloc_get_type_abort(private_data,
1039 struct smbd_parent_context);
1041 change_to_root_user();
1042 DEBUG(1,("parent: Reloading services after SIGHUP\n"));
1043 reload_services(NULL, NULL, false);
1045 printing_subsystem_update(parent->ev_ctx, parent->msg_ctx, true);
1048 /****************************************************************************
1049 main program.
1050 ****************************************************************************/
1052 /* Declare prototype for build_options() to avoid having to run it through
1053 mkproto.h. Mixing $(builddir) and $(srcdir) source files in the current
1054 prototype generation system is too complicated. */
1056 extern void build_options(bool screen);
1058 int main(int argc,const char *argv[])
1060 /* shall I run as a daemon */
1061 bool is_daemon = false;
1062 bool interactive = false;
1063 bool Fork = true;
1064 bool no_process_group = false;
1065 bool log_stdout = false;
1066 char *ports = NULL;
1067 char *profile_level = NULL;
1068 int opt;
1069 poptContext pc;
1070 bool print_build_options = False;
1071 enum {
1072 OPT_DAEMON = 1000,
1073 OPT_INTERACTIVE,
1074 OPT_FORK,
1075 OPT_NO_PROCESS_GROUP,
1076 OPT_LOG_STDOUT
1078 struct poptOption long_options[] = {
1079 POPT_AUTOHELP
1080 {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" },
1081 {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"},
1082 {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" },
1083 {"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
1084 {"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
1085 {"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
1086 {"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
1087 {"profiling-level", 'P', POPT_ARG_STRING, &profile_level, 0, "Set profiling level","PROFILE_LEVEL"},
1088 POPT_COMMON_SAMBA
1089 POPT_TABLEEND
1091 struct smbd_parent_context *parent = NULL;
1092 TALLOC_CTX *frame;
1093 NTSTATUS status;
1094 struct tevent_context *ev_ctx;
1095 struct messaging_context *msg_ctx;
1096 struct server_id server_id;
1097 struct tevent_signal *se;
1098 int profiling_level;
1099 char *np_dir = NULL;
1100 static const struct smbd_shim smbd_shim_fns =
1102 .cancel_pending_lock_requests_by_fid = smbd_cancel_pending_lock_requests_by_fid,
1103 .send_stat_cache_delete_message = smbd_send_stat_cache_delete_message,
1104 .change_to_root_user = smbd_change_to_root_user,
1105 .become_authenticated_pipe_user = smbd_become_authenticated_pipe_user,
1106 .unbecome_authenticated_pipe_user = smbd_unbecome_authenticated_pipe_user,
1108 .contend_level2_oplocks_begin = smbd_contend_level2_oplocks_begin,
1109 .contend_level2_oplocks_end = smbd_contend_level2_oplocks_end,
1111 .become_root = smbd_become_root,
1112 .unbecome_root = smbd_unbecome_root,
1114 .exit_server = smbd_exit_server,
1115 .exit_server_cleanly = smbd_exit_server_cleanly,
1119 * Do this before any other talloc operation
1121 talloc_enable_null_tracking();
1122 frame = talloc_stackframe();
1124 setup_logging(argv[0], DEBUG_DEFAULT_STDOUT);
1126 smb_init_locale();
1128 set_smbd_shim(&smbd_shim_fns);
1130 smbd_init_globals();
1132 TimeInit();
1134 #ifdef HAVE_SET_AUTH_PARAMETERS
1135 set_auth_parameters(argc,argv);
1136 #endif
1138 pc = poptGetContext("smbd", argc, argv, long_options, 0);
1139 while((opt = poptGetNextOpt(pc)) != -1) {
1140 switch (opt) {
1141 case OPT_DAEMON:
1142 is_daemon = true;
1143 break;
1144 case OPT_INTERACTIVE:
1145 interactive = true;
1146 break;
1147 case OPT_FORK:
1148 Fork = false;
1149 break;
1150 case OPT_NO_PROCESS_GROUP:
1151 no_process_group = true;
1152 break;
1153 case OPT_LOG_STDOUT:
1154 log_stdout = true;
1155 break;
1156 case 'b':
1157 print_build_options = True;
1158 break;
1159 default:
1160 d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
1161 poptBadOption(pc, 0), poptStrerror(opt));
1162 poptPrintUsage(pc, stderr, 0);
1163 exit(1);
1166 poptFreeContext(pc);
1168 if (interactive) {
1169 Fork = False;
1170 log_stdout = True;
1173 if (log_stdout) {
1174 setup_logging(argv[0], DEBUG_STDOUT);
1175 } else {
1176 setup_logging(argv[0], DEBUG_FILE);
1179 if (print_build_options) {
1180 build_options(True); /* Display output to screen as well as debug */
1181 exit(0);
1184 #ifdef HAVE_SETLUID
1185 /* needed for SecureWare on SCO */
1186 setluid(0);
1187 #endif
1189 set_remote_machine_name("smbd", False);
1191 if (interactive && (DEBUGLEVEL >= 9)) {
1192 talloc_enable_leak_report();
1195 if (log_stdout && Fork) {
1196 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
1197 exit(1);
1200 /* we want to re-seed early to prevent time delays causing
1201 client problems at a later date. (tridge) */
1202 generate_random_buffer(NULL, 0);
1204 /* get initial effective uid and gid */
1205 sec_init();
1207 /* make absolutely sure we run as root - to handle cases where people
1208 are crazy enough to have it setuid */
1209 gain_root_privilege();
1210 gain_root_group_privilege();
1212 fault_setup();
1213 dump_core_setup("smbd", lp_logfile(talloc_tos()));
1215 /* we are never interested in SIGPIPE */
1216 BlockSignals(True,SIGPIPE);
1218 #if defined(SIGFPE)
1219 /* we are never interested in SIGFPE */
1220 BlockSignals(True,SIGFPE);
1221 #endif
1223 #if defined(SIGUSR2)
1224 /* We are no longer interested in USR2 */
1225 BlockSignals(True,SIGUSR2);
1226 #endif
1228 /* POSIX demands that signals are inherited. If the invoking process has
1229 * these signals masked, we will have problems, as we won't recieve them. */
1230 BlockSignals(False, SIGHUP);
1231 BlockSignals(False, SIGUSR1);
1232 BlockSignals(False, SIGTERM);
1234 /* Ensure we leave no zombies until we
1235 * correctly set up child handling below. */
1237 CatchChild();
1239 /* we want total control over the permissions on created files,
1240 so set our umask to 0 */
1241 umask(0);
1243 reopen_logs();
1245 DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1246 DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1248 DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1249 (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1251 /* Output the build options to the debug log */
1252 build_options(False);
1254 if (sizeof(uint16) < 2 || sizeof(uint32) < 4) {
1255 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1256 exit(1);
1259 if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1260 DEBUG(0, ("error opening config file '%s'\n", get_dyn_CONFIGFILE()));
1261 exit(1);
1264 if (!cluster_probe_ok()) {
1265 exit(1);
1268 /* Init the security context and global current_user */
1269 init_sec_ctx();
1272 * Initialize the event context. The event context needs to be
1273 * initialized before the messaging context, cause the messaging
1274 * context holds an event context.
1275 * FIXME: This should be s3_tevent_context_init()
1277 ev_ctx = server_event_context();
1278 if (ev_ctx == NULL) {
1279 exit(1);
1283 * Init the messaging context
1284 * FIXME: This should only call messaging_init()
1286 msg_ctx = server_messaging_context();
1287 if (msg_ctx == NULL) {
1288 exit(1);
1292 * Reloading of the printers will not work here as we don't have a
1293 * server info and rpc services set up. It will be called later.
1295 if (!reload_services(NULL, NULL, false)) {
1296 exit(1);
1299 if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC
1300 && !lp_parm_bool(-1, "server role check", "inhibit", false)) {
1301 DEBUG(0, ("server role = 'active directory domain controller' not compatible with running smbd standalone. \n"));
1302 DEBUGADD(0, ("You should start 'samba' instead, and it will control starting smbd if required\n"));
1303 exit(1);
1306 /* ...NOTE... Log files are working from this point! */
1308 DEBUG(3,("loaded services\n"));
1310 init_structs();
1312 if (!profile_setup(msg_ctx, False)) {
1313 DEBUG(0,("ERROR: failed to setup profiling\n"));
1314 return -1;
1317 if (profile_level != NULL) {
1318 profiling_level = atoi(profile_level);
1319 } else {
1320 profiling_level = lp_smbd_profiling_level();
1322 set_profile_level(profiling_level, messaging_server_id(msg_ctx));
1324 if (!is_daemon && !is_a_socket(0)) {
1325 if (!interactive) {
1326 DEBUG(3, ("Standard input is not a socket, "
1327 "assuming -D option\n"));
1331 * Setting is_daemon here prevents us from eventually calling
1332 * the open_sockets_inetd()
1335 is_daemon = True;
1338 if (is_daemon && !interactive) {
1339 DEBUG(3, ("Becoming a daemon.\n"));
1340 become_daemon(Fork, no_process_group, log_stdout);
1343 set_my_unique_id(serverid_get_random_unique_id());
1345 #if HAVE_SETPGID
1347 * If we're interactive we want to set our own process group for
1348 * signal management.
1350 if (interactive && !no_process_group)
1351 setpgid( (pid_t)0, (pid_t)0);
1352 #endif
1354 if (!directory_exist(lp_lock_directory()))
1355 mkdir(lp_lock_directory(), 0755);
1357 if (!directory_exist(lp_pid_directory()))
1358 mkdir(lp_pid_directory(), 0755);
1360 if (is_daemon)
1361 pidfile_create(lp_pid_directory(), "smbd");
1363 status = reinit_after_fork(msg_ctx,
1364 ev_ctx,
1365 false);
1366 if (!NT_STATUS_IS_OK(status)) {
1367 exit_daemon("reinit_after_fork() failed", map_errno_from_nt_status(status));
1370 if (!interactive) {
1372 * Do not initialize the parent-child-pipe before becoming a
1373 * daemon: this is used to detect a died parent in the child
1374 * process.
1376 status = init_before_fork();
1377 if (!NT_STATUS_IS_OK(status)) {
1378 exit_daemon(nt_errstr(status), map_errno_from_nt_status(status));
1382 parent = talloc_zero(ev_ctx, struct smbd_parent_context);
1383 if (!parent) {
1384 exit_server("talloc(struct smbd_parent_context) failed");
1386 parent->interactive = interactive;
1387 parent->ev_ctx = ev_ctx;
1388 parent->msg_ctx = msg_ctx;
1389 am_parent = parent;
1391 se = tevent_add_signal(parent->ev_ctx,
1392 parent,
1393 SIGTERM, 0,
1394 smbd_parent_sig_term_handler,
1395 parent);
1396 if (!se) {
1397 exit_server("failed to setup SIGTERM handler");
1399 se = tevent_add_signal(parent->ev_ctx,
1400 parent,
1401 SIGHUP, 0,
1402 smbd_parent_sig_hup_handler,
1403 parent);
1404 if (!se) {
1405 exit_server("failed to setup SIGHUP handler");
1408 /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1410 if (smbd_memcache() == NULL) {
1411 exit_daemon("no memcache available", EACCES);
1414 memcache_set_global(smbd_memcache());
1416 /* Initialise the password backed before the global_sam_sid
1417 to ensure that we fetch from ldap before we make a domain sid up */
1419 if(!initialize_password_db(false, ev_ctx))
1420 exit(1);
1422 if (!secrets_init()) {
1423 exit_daemon("smbd can not open secrets.tdb", EACCES);
1426 if (lp_server_role() == ROLE_DOMAIN_BDC || lp_server_role() == ROLE_DOMAIN_PDC) {
1427 struct loadparm_context *lp_ctx = loadparm_init_s3(NULL, loadparm_s3_helpers());
1428 if (!open_schannel_session_store(NULL, lp_ctx)) {
1429 exit_daemon("ERROR: Samba cannot open schannel store for secured NETLOGON operations.", EACCES);
1431 TALLOC_FREE(lp_ctx);
1434 if(!get_global_sam_sid()) {
1435 exit_daemon("Samba cannot create a SAM SID", EACCES);
1438 server_id = messaging_server_id(msg_ctx);
1439 status = smbXsrv_version_global_init(&server_id);
1440 if (!NT_STATUS_IS_OK(status)) {
1441 exit_daemon("Samba cannot init server context", EACCES);
1444 status = smbXsrv_session_global_init();
1445 if (!NT_STATUS_IS_OK(status)) {
1446 exit_daemon("Samba cannot init session context", EACCES);
1449 status = smbXsrv_tcon_global_init();
1450 if (!NT_STATUS_IS_OK(status)) {
1451 exit_daemon("Samba cannot init tcon context", EACCES);
1454 if (!locking_init())
1455 exit_daemon("Samba cannot init locking", EACCES);
1457 if (!leases_db_init(false)) {
1458 exit_daemon("Samba cannot init leases", EACCES);
1461 if (!smbd_parent_notify_init(NULL, msg_ctx, ev_ctx)) {
1462 exit_daemon("Samba cannot init notification", EACCES);
1465 if (!messaging_parent_dgm_cleanup_init(msg_ctx)) {
1466 exit(1);
1469 if (!smbd_scavenger_init(NULL, msg_ctx, ev_ctx)) {
1470 exit_daemon("Samba cannot init scavenging", EACCES);
1473 if (!serverid_parent_init(ev_ctx)) {
1474 exit_daemon("Samba cannot init server id", EACCES);
1477 if (!W_ERROR_IS_OK(registry_init_full()))
1478 exit_daemon("Samba cannot init registry", EACCES);
1480 /* Open the share_info.tdb here, so we don't have to open
1481 after the fork on every single connection. This is a small
1482 performance improvment and reduces the total number of system
1483 fds used. */
1484 if (!share_info_db_init()) {
1485 exit_daemon("ERROR: failed to load share info db.", EACCES);
1488 status = init_system_session_info();
1489 if (!NT_STATUS_IS_OK(status)) {
1490 DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
1491 nt_errstr(status)));
1492 return -1;
1495 if (!init_guest_info()) {
1496 DEBUG(0,("ERROR: failed to setup guest info.\n"));
1497 return -1;
1500 if (!file_init_global()) {
1501 DEBUG(0, ("ERROR: file_init_global() failed\n"));
1502 return -1;
1504 status = smbXsrv_open_global_init();
1505 if (!NT_STATUS_IS_OK(status)) {
1506 exit_daemon("Samba cannot init global open", map_errno_from_nt_status(status));
1509 /* This MUST be done before start_epmd() because otherwise
1510 * start_epmd() forks and races against dcesrv_ep_setup() to
1511 * call directory_create_or_exist() */
1512 if (!directory_create_or_exist(lp_ncalrpc_dir(), 0755)) {
1513 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
1514 lp_ncalrpc_dir(), strerror(errno)));
1515 return -1;
1518 np_dir = talloc_asprintf(talloc_tos(), "%s/np", lp_ncalrpc_dir());
1519 if (!np_dir) {
1520 DEBUG(0, ("%s: Out of memory\n", __location__));
1521 return -1;
1524 if (!directory_create_or_exist_strict(np_dir, geteuid(), 0700)) {
1525 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
1526 np_dir, strerror(errno)));
1527 return -1;
1530 if (is_daemon && !interactive) {
1531 if (rpc_epmapper_daemon() == RPC_DAEMON_FORK) {
1532 start_epmd(ev_ctx, msg_ctx);
1536 if (!dcesrv_ep_setup(ev_ctx, msg_ctx)) {
1537 exit_daemon("Samba cannot setup ep pipe", EACCES);
1540 if (is_daemon && !interactive) {
1541 daemon_ready("smbd");
1544 /* only start other daemons if we are running as a daemon
1545 * -- bad things will happen if smbd is launched via inetd
1546 * and we fork a copy of ourselves here */
1547 if (is_daemon && !interactive) {
1549 if (rpc_lsasd_daemon() == RPC_DAEMON_FORK) {
1550 start_lsasd(ev_ctx, msg_ctx);
1553 if (rpc_fss_daemon() == RPC_DAEMON_FORK) {
1554 start_fssd(ev_ctx, msg_ctx);
1557 if (!lp__disable_spoolss() &&
1558 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
1559 bool bgq = lp_parm_bool(-1, "smbd", "backgroundqueue", true);
1561 if (!printing_subsystem_init(ev_ctx, msg_ctx, true, bgq)) {
1562 exit_daemon("Samba failed to init printing subsystem", EACCES);
1565 } else if (!lp__disable_spoolss() &&
1566 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
1567 if (!printing_subsystem_init(ev_ctx, msg_ctx, false, false)) {
1568 exit(1);
1572 if (!is_daemon) {
1573 int sock;
1575 /* inetd mode */
1576 TALLOC_FREE(frame);
1578 /* Started from inetd. fd 0 is the socket. */
1579 /* We will abort gracefully when the client or remote system
1580 goes away */
1581 sock = dup(0);
1583 /* close stdin, stdout (if not logging to it), but not stderr */
1584 close_low_fds(true, !debug_get_output_is_stdout(), false);
1586 #ifdef HAVE_ATEXIT
1587 atexit(killkids);
1588 #endif
1590 /* Stop zombies */
1591 smbd_setup_sig_chld_handler(parent);
1593 smbd_process(ev_ctx, msg_ctx, sock, true);
1595 exit_server_cleanly(NULL);
1596 return(0);
1599 if (!open_sockets_smbd(parent, ev_ctx, msg_ctx, ports))
1600 exit_server("open_sockets_smbd() failed");
1602 /* do a printer update now that all messaging has been set up,
1603 * before we allow clients to start connecting */
1604 if (!lp__disable_spoolss() &&
1605 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
1606 printing_subsystem_update(ev_ctx, msg_ctx, false);
1609 TALLOC_FREE(frame);
1610 /* make sure we always have a valid stackframe */
1611 frame = talloc_stackframe();
1613 if (!Fork) {
1614 /* if we are running in the foreground then look for
1615 EOF on stdin, and exit if it happens. This allows
1616 us to die if the parent process dies
1617 Only do this on a pipe or socket, no other device.
1619 struct stat st;
1620 if (fstat(0, &st) != 0) {
1621 return false;
1623 if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
1624 tevent_add_fd(ev_ctx,
1625 parent,
1627 TEVENT_FD_READ,
1628 smbd_stdin_handler,
1629 NULL);
1633 smbd_parent_loop(ev_ctx, parent);
1635 exit_server_cleanly(NULL);
1636 TALLOC_FREE(frame);
1637 return(0);