CVE-2020-25719 mit-samba: Add mit_samba_princ_needs_pac()
[Samba.git] / source3 / smbd / server.c
blobd7f5b4b73c0f85ac799511dfda1355d42dff585e
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 "lib/util/server_id.h"
27 #include "lib/util/close_low_fd.h"
28 #include "lib/cmdline/cmdline.h"
29 #include "locking/share_mode_lock.h"
30 #include "smbd/smbd.h"
31 #include "smbd/globals.h"
32 #include "registry/reg_init_full.h"
33 #include "libcli/auth/schannel.h"
34 #include "secrets.h"
35 #include "../lib/util/memcache.h"
36 #include "ctdbd_conn.h"
37 #include "util_cluster.h"
38 #include "printing/queue_process.h"
39 #include "rpc_server/rpc_service_setup.h"
40 #include "rpc_server/rpc_config.h"
41 #include "passdb.h"
42 #include "auth.h"
43 #include "messages.h"
44 #include "messages_ctdb.h"
45 #include "smbprofile.h"
46 #include "lib/id_cache.h"
47 #include "lib/param/param.h"
48 #include "lib/background.h"
49 #include "../lib/util/pidfile.h"
50 #include "lib/smbd_shim.h"
51 #include "scavenger.h"
52 #include "locking/leases_db.h"
53 #include "smbd/notifyd/notifyd.h"
54 #include "smbd/smbd_cleanupd.h"
55 #include "lib/util/sys_rw.h"
56 #include "cleanupdb.h"
57 #include "g_lock.h"
58 #include "rpc_server/epmd.h"
59 #include "rpc_server/lsasd.h"
60 #include "rpc_server/fssd.h"
61 #include "rpc_server/mdssd.h"
62 #include "lib/global_contexts.h"
64 #ifdef CLUSTER_SUPPORT
65 #include "ctdb_protocol.h"
66 #endif
68 struct smbd_open_socket;
69 struct smbd_child_pid;
71 struct smbd_parent_context {
72 bool interactive;
74 struct tevent_context *ev_ctx;
75 struct messaging_context *msg_ctx;
76 struct dcesrv_context *dce_ctx;
78 /* the list of listening sockets */
79 struct smbd_open_socket *sockets;
81 /* the list of current child processes */
82 struct smbd_child_pid *children;
83 size_t num_children;
85 struct server_id cleanupd;
86 struct server_id notifyd;
88 struct tevent_timer *cleanup_te;
91 struct smbd_open_socket {
92 struct smbd_open_socket *prev, *next;
93 struct smbd_parent_context *parent;
94 int fd;
95 struct tevent_fd *fde;
98 struct smbd_child_pid {
99 struct smbd_child_pid *prev, *next;
100 pid_t pid;
103 /*******************************************************************
104 What to do when smb.conf is updated.
105 ********************************************************************/
107 static NTSTATUS messaging_send_to_children(struct messaging_context *msg_ctx,
108 uint32_t msg_type, DATA_BLOB* data);
110 static void smbd_parent_conf_updated(struct messaging_context *msg,
111 void *private_data,
112 uint32_t msg_type,
113 struct server_id server_id,
114 DATA_BLOB *data)
116 struct tevent_context *ev_ctx =
117 talloc_get_type_abort(private_data, struct tevent_context);
118 bool ok;
120 DEBUG(10,("smbd_parent_conf_updated: Got message saying smb.conf was "
121 "updated. Reloading.\n"));
122 change_to_root_user();
123 reload_services(NULL, NULL, false);
124 printing_subsystem_update(ev_ctx, msg, false);
126 ok = reinit_guest_session_info(NULL);
127 if (!ok) {
128 DBG_ERR("Failed to reinit guest info\n");
130 messaging_send_to_children(msg, MSG_SMB_CONF_UPDATED, NULL);
133 /*******************************************************************
134 Delete a statcache entry.
135 ********************************************************************/
137 static void smb_stat_cache_delete(struct messaging_context *msg,
138 void *private_data,
139 uint32_t msg_tnype,
140 struct server_id server_id,
141 DATA_BLOB *data)
143 const char *name = (const char *)data->data;
144 DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
145 stat_cache_delete(name);
148 /****************************************************************************
149 Send a SIGTERM to our process group.
150 *****************************************************************************/
152 static void killkids(void)
154 if(am_parent) kill(0,SIGTERM);
157 static void msg_exit_server(struct messaging_context *msg,
158 void *private_data,
159 uint32_t msg_type,
160 struct server_id server_id,
161 DATA_BLOB *data)
163 DEBUG(3, ("got a SHUTDOWN message\n"));
164 exit_server_cleanly(NULL);
167 #ifdef DEVELOPER
168 static void msg_inject_fault(struct messaging_context *msg,
169 void *private_data,
170 uint32_t msg_type,
171 struct server_id src,
172 DATA_BLOB *data)
174 int sig;
175 struct server_id_buf tmp;
177 if (data->length != sizeof(sig)) {
178 DEBUG(0, ("Process %s sent bogus signal injection request\n",
179 server_id_str_buf(src, &tmp)));
180 return;
183 sig = *(int *)data->data;
184 if (sig == -1) {
185 exit_server("internal error injected");
186 return;
189 #ifdef HAVE_STRSIGNAL
190 DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
191 server_id_str_buf(src, &tmp), sig, strsignal(sig)));
192 #else
193 DEBUG(0, ("Process %s requested injection of signal %d\n",
194 server_id_str_buf(src, &tmp), sig));
195 #endif
197 kill(getpid(), sig);
199 #endif /* DEVELOPER */
201 #if defined(DEVELOPER) || defined(ENABLE_SELFTEST)
203 * Sleep for the specified number of seconds.
205 static void msg_sleep(struct messaging_context *msg,
206 void *private_data,
207 uint32_t msg_type,
208 struct server_id src,
209 DATA_BLOB *data)
211 unsigned int seconds;
212 struct server_id_buf tmp;
214 if (data->length != sizeof(seconds)) {
215 DBG_ERR("Process %s sent bogus sleep request\n",
216 server_id_str_buf(src, &tmp));
217 return;
220 seconds = *(unsigned int *)data->data;
221 DBG_ERR("Process %s request a sleep of %u seconds\n",
222 server_id_str_buf(src, &tmp),
223 seconds);
224 sleep(seconds);
225 DBG_ERR("Restarting after %u second sleep requested by process %s\n",
226 seconds,
227 server_id_str_buf(src, &tmp));
229 #endif /* DEVELOPER */
231 static NTSTATUS messaging_send_to_children(struct messaging_context *msg_ctx,
232 uint32_t msg_type, DATA_BLOB* data)
234 NTSTATUS status;
235 struct smbd_parent_context *parent = am_parent;
236 struct smbd_child_pid *child;
238 if (parent == NULL) {
239 return NT_STATUS_INTERNAL_ERROR;
242 for (child = parent->children; child != NULL; child = child->next) {
243 status = messaging_send(parent->msg_ctx,
244 pid_to_procid(child->pid),
245 msg_type, data);
246 if (!NT_STATUS_IS_OK(status)) {
247 DBG_DEBUG("messaging_send(%d) failed: %s\n",
248 (int)child->pid, nt_errstr(status));
251 return NT_STATUS_OK;
254 static void smb_parent_send_to_children(struct messaging_context *ctx,
255 void* data,
256 uint32_t msg_type,
257 struct server_id srv_id,
258 DATA_BLOB* msg_data)
260 messaging_send_to_children(ctx, msg_type, msg_data);
264 * Parent smbd process sets its own debug level first and then
265 * sends a message to all the smbd children to adjust their debug
266 * level to that of the parent.
269 static void smbd_msg_debug(struct messaging_context *msg_ctx,
270 void *private_data,
271 uint32_t msg_type,
272 struct server_id server_id,
273 DATA_BLOB *data)
275 debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
277 messaging_send_to_children(msg_ctx, MSG_DEBUG, data);
280 static void smbd_parent_id_cache_kill(struct messaging_context *msg_ctx,
281 void *private_data,
282 uint32_t msg_type,
283 struct server_id server_id,
284 DATA_BLOB* data)
286 const char *msg = (data && data->data)
287 ? (const char *)data->data : "<NULL>";
288 struct id_cache_ref id;
290 if (!id_cache_ref_parse(msg, &id)) {
291 DEBUG(0, ("Invalid ?ID: %s\n", msg));
292 return;
295 id_cache_delete_from_cache(&id);
297 messaging_send_to_children(msg_ctx, msg_type, data);
300 static void smbd_parent_id_cache_delete(struct messaging_context *ctx,
301 void* data,
302 uint32_t msg_type,
303 struct server_id srv_id,
304 DATA_BLOB* msg_data)
306 id_cache_delete_message(ctx, data, msg_type, srv_id, msg_data);
308 messaging_send_to_children(ctx, msg_type, msg_data);
311 static void add_child_pid(struct smbd_parent_context *parent,
312 pid_t pid)
314 struct smbd_child_pid *child;
316 child = talloc_zero(parent, struct smbd_child_pid);
317 if (child == NULL) {
318 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
319 return;
321 child->pid = pid;
322 DLIST_ADD(parent->children, child);
323 parent->num_children += 1;
326 static void smb_tell_num_children(struct messaging_context *ctx, void *data,
327 uint32_t msg_type, struct server_id srv_id,
328 DATA_BLOB *msg_data)
330 uint8_t buf[sizeof(uint32_t)];
332 if (am_parent) {
333 SIVAL(buf, 0, am_parent->num_children);
334 messaging_send_buf(ctx, srv_id, MSG_SMB_NUM_CHILDREN,
335 buf, sizeof(buf));
339 static void notifyd_stopped(struct tevent_req *req);
341 static struct tevent_req *notifyd_req(struct messaging_context *msg_ctx,
342 struct tevent_context *ev)
344 struct tevent_req *req;
345 sys_notify_watch_fn sys_notify_watch = NULL;
346 struct sys_notify_context *sys_notify_ctx = NULL;
347 struct ctdbd_connection *ctdbd_conn = NULL;
349 if (lp_kernel_change_notify()) {
351 #ifdef HAVE_INOTIFY
352 if (lp_parm_bool(-1, "notify", "inotify", true)) {
353 sys_notify_watch = inotify_watch;
355 #endif
357 #ifdef HAVE_FAM
358 if (lp_parm_bool(-1, "notify", "fam",
359 (sys_notify_watch == NULL))) {
360 sys_notify_watch = fam_watch;
362 #endif
365 if (sys_notify_watch != NULL) {
366 sys_notify_ctx = sys_notify_context_create(msg_ctx, ev);
367 if (sys_notify_ctx == NULL) {
368 return NULL;
372 if (lp_clustering()) {
373 ctdbd_conn = messaging_ctdb_connection();
376 req = notifyd_send(msg_ctx, ev, msg_ctx, ctdbd_conn,
377 sys_notify_watch, sys_notify_ctx);
378 if (req == NULL) {
379 TALLOC_FREE(sys_notify_ctx);
380 return NULL;
382 tevent_req_set_callback(req, notifyd_stopped, msg_ctx);
384 return req;
387 static void notifyd_stopped(struct tevent_req *req)
389 int ret;
391 ret = notifyd_recv(req);
392 TALLOC_FREE(req);
393 DEBUG(1, ("notifyd stopped: %s\n", strerror(ret)));
396 static void notifyd_sig_hup_handler(struct tevent_context *ev,
397 struct tevent_signal *se,
398 int signum,
399 int count,
400 void *siginfo,
401 void *pvt)
403 DBG_NOTICE("notifyd: Reloading services after SIGHUP\n");
404 reload_services(NULL, NULL, false);
407 static bool smbd_notifyd_init(struct messaging_context *msg, bool interactive,
408 struct server_id *ppid)
410 struct tevent_context *ev = messaging_tevent_context(msg);
411 struct tevent_req *req;
412 pid_t pid;
413 NTSTATUS status;
414 bool ok;
415 struct tevent_signal *se;
417 if (interactive) {
418 req = notifyd_req(msg, ev);
419 return (req != NULL);
422 pid = fork();
423 if (pid == -1) {
424 DEBUG(1, ("%s: fork failed: %s\n", __func__,
425 strerror(errno)));
426 return false;
429 if (pid != 0) {
430 if (am_parent != NULL) {
431 add_child_pid(am_parent, pid);
433 *ppid = pid_to_procid(pid);
434 return true;
437 status = smbd_reinit_after_fork(msg, ev, true, "smbd-notifyd");
438 if (!NT_STATUS_IS_OK(status)) {
439 DEBUG(1, ("%s: reinit_after_fork failed: %s\n",
440 __func__, nt_errstr(status)));
441 exit(1);
444 reopen_logs();
446 /* Set up sighup handler for notifyd */
447 se = tevent_add_signal(ev,
449 SIGHUP, 0,
450 notifyd_sig_hup_handler,
451 NULL);
452 if (!se) {
453 DEBUG(0, ("failed to setup notifyd SIGHUP handler\n"));
454 exit(1);
457 req = notifyd_req(msg, ev);
458 if (req == NULL) {
459 exit(1);
461 tevent_req_set_callback(req, notifyd_stopped, msg);
463 /* Block those signals that we are not handling */
464 BlockSignals(True, SIGUSR1);
466 messaging_send(msg, pid_to_procid(getppid()), MSG_SMB_NOTIFY_STARTED,
467 NULL);
469 ok = tevent_req_poll(req, ev);
470 if (!ok) {
471 DBG_WARNING("tevent_req_poll returned %s\n", strerror(errno));
472 exit(1);
474 exit(0);
477 static void notifyd_init_trigger(struct tevent_req *req);
479 struct notifyd_init_state {
480 bool ok;
481 struct tevent_context *ev;
482 struct messaging_context *msg;
483 struct server_id *ppid;
486 static struct tevent_req *notifyd_init_send(struct tevent_context *ev,
487 TALLOC_CTX *mem_ctx,
488 struct messaging_context *msg,
489 struct server_id *ppid)
491 struct tevent_req *req = NULL;
492 struct tevent_req *subreq = NULL;
493 struct notifyd_init_state *state = NULL;
495 req = tevent_req_create(mem_ctx, &state, struct notifyd_init_state);
496 if (req == NULL) {
497 return NULL;
500 *state = (struct notifyd_init_state) {
501 .msg = msg,
502 .ev = ev,
503 .ppid = ppid
506 subreq = tevent_wakeup_send(state, ev, tevent_timeval_current_ofs(1, 0));
507 if (tevent_req_nomem(subreq, req)) {
508 return tevent_req_post(req, ev);
511 tevent_req_set_callback(subreq, notifyd_init_trigger, req);
512 return req;
515 static void notifyd_init_trigger(struct tevent_req *subreq)
517 struct tevent_req *req = tevent_req_callback_data(
518 subreq, struct tevent_req);
519 struct notifyd_init_state *state = tevent_req_data(
520 req, struct notifyd_init_state);
521 bool ok;
523 DBG_NOTICE("Triggering notifyd startup\n");
525 ok = tevent_wakeup_recv(subreq);
526 TALLOC_FREE(subreq);
527 if (!ok) {
528 tevent_req_error(req, ENOMEM);
529 return;
532 state->ok = smbd_notifyd_init(state->msg, false, state->ppid);
533 if (state->ok) {
534 DBG_WARNING("notifyd restarted\n");
535 tevent_req_done(req);
536 return;
539 DBG_NOTICE("notifyd startup failed, rescheduling\n");
541 subreq = tevent_wakeup_send(state, state->ev,
542 tevent_timeval_current_ofs(1, 0));
543 if (tevent_req_nomem(subreq, req)) {
544 DBG_ERR("scheduling notifyd restart failed, giving up\n");
545 return;
548 tevent_req_set_callback(subreq, notifyd_init_trigger, req);
549 return;
552 static bool notifyd_init_recv(struct tevent_req *req)
554 struct notifyd_init_state *state = tevent_req_data(
555 req, struct notifyd_init_state);
557 return state->ok;
560 static void notifyd_started(struct tevent_req *req)
562 bool ok;
564 ok = notifyd_init_recv(req);
565 TALLOC_FREE(req);
566 if (!ok) {
567 DBG_ERR("Failed to restart notifyd, giving up\n");
568 return;
572 static void cleanupd_stopped(struct tevent_req *req);
574 static bool cleanupd_init(struct messaging_context *msg, bool interactive,
575 struct server_id *ppid)
577 struct tevent_context *ev = messaging_tevent_context(msg);
578 struct server_id parent_id = messaging_server_id(msg);
579 struct tevent_req *req;
580 pid_t pid;
581 NTSTATUS status;
582 ssize_t rwret;
583 int ret;
584 bool ok;
585 char c;
586 int up_pipe[2];
588 if (interactive) {
589 req = smbd_cleanupd_send(msg, ev, msg, parent_id.pid);
590 *ppid = messaging_server_id(msg);
591 return (req != NULL);
594 ret = pipe(up_pipe);
595 if (ret == -1) {
596 DBG_WARNING("pipe failed: %s\n", strerror(errno));
597 return false;
600 pid = fork();
601 if (pid == -1) {
602 DBG_WARNING("fork failed: %s\n", strerror(errno));
603 close(up_pipe[0]);
604 close(up_pipe[1]);
605 return false;
608 if (pid != 0) {
610 close(up_pipe[1]);
611 rwret = sys_read(up_pipe[0], &c, 1);
612 close(up_pipe[0]);
614 if (rwret == -1) {
615 DBG_WARNING("sys_read failed: %s\n", strerror(errno));
616 return false;
618 if (rwret == 0) {
619 DBG_WARNING("cleanupd could not start\n");
620 return false;
622 if (c != 0) {
623 DBG_WARNING("cleanupd returned %d\n", (int)c);
624 return false;
627 DBG_DEBUG("Started cleanupd pid=%d\n", (int)pid);
629 if (am_parent != NULL) {
630 add_child_pid(am_parent, pid);
633 *ppid = pid_to_procid(pid);
634 return true;
637 close(up_pipe[0]);
639 status = smbd_reinit_after_fork(msg, ev, true, "cleanupd");
640 if (!NT_STATUS_IS_OK(status)) {
641 DBG_WARNING("reinit_after_fork failed: %s\n",
642 nt_errstr(status));
643 c = 1;
644 sys_write(up_pipe[1], &c, 1);
646 exit(1);
649 req = smbd_cleanupd_send(msg, ev, msg, parent_id.pid);
650 if (req == NULL) {
651 DBG_WARNING("smbd_cleanupd_send failed\n");
652 c = 2;
653 sys_write(up_pipe[1], &c, 1);
655 exit(1);
658 tevent_req_set_callback(req, cleanupd_stopped, msg);
660 c = 0;
661 rwret = sys_write(up_pipe[1], &c, 1);
662 close(up_pipe[1]);
664 if (rwret == -1) {
665 DBG_WARNING("sys_write failed: %s\n", strerror(errno));
666 exit(1);
668 if (rwret != 1) {
669 DBG_WARNING("sys_write could not write result\n");
670 exit(1);
673 ok = tevent_req_poll(req, ev);
674 if (!ok) {
675 DBG_WARNING("tevent_req_poll returned %s\n", strerror(errno));
677 exit(0);
680 static void cleanupd_stopped(struct tevent_req *req)
682 NTSTATUS status;
684 status = smbd_cleanupd_recv(req);
685 DBG_WARNING("cleanupd stopped: %s\n", nt_errstr(status));
688 static void cleanupd_init_trigger(struct tevent_req *req);
690 struct cleanup_init_state {
691 bool ok;
692 struct tevent_context *ev;
693 struct messaging_context *msg;
694 struct server_id *ppid;
697 static struct tevent_req *cleanupd_init_send(struct tevent_context *ev,
698 TALLOC_CTX *mem_ctx,
699 struct messaging_context *msg,
700 struct server_id *ppid)
702 struct tevent_req *req = NULL;
703 struct tevent_req *subreq = NULL;
704 struct cleanup_init_state *state = NULL;
706 req = tevent_req_create(mem_ctx, &state, struct cleanup_init_state);
707 if (req == NULL) {
708 return NULL;
711 *state = (struct cleanup_init_state) {
712 .msg = msg,
713 .ev = ev,
714 .ppid = ppid
717 subreq = tevent_wakeup_send(state, ev, tevent_timeval_current_ofs(0, 0));
718 if (tevent_req_nomem(subreq, req)) {
719 return tevent_req_post(req, ev);
722 tevent_req_set_callback(subreq, cleanupd_init_trigger, req);
723 return req;
726 static void cleanupd_init_trigger(struct tevent_req *subreq)
728 struct tevent_req *req = tevent_req_callback_data(
729 subreq, struct tevent_req);
730 struct cleanup_init_state *state = tevent_req_data(
731 req, struct cleanup_init_state);
732 bool ok;
734 DBG_NOTICE("Triggering cleanupd startup\n");
736 ok = tevent_wakeup_recv(subreq);
737 TALLOC_FREE(subreq);
738 if (!ok) {
739 tevent_req_error(req, ENOMEM);
740 return;
743 state->ok = cleanupd_init(state->msg, false, state->ppid);
744 if (state->ok) {
745 DBG_WARNING("cleanupd restarted\n");
746 tevent_req_done(req);
747 return;
750 DBG_NOTICE("cleanupd startup failed, rescheduling\n");
752 subreq = tevent_wakeup_send(state, state->ev,
753 tevent_timeval_current_ofs(1, 0));
754 if (tevent_req_nomem(subreq, req)) {
755 DBG_ERR("scheduling cleanupd restart failed, giving up\n");
756 return;
759 tevent_req_set_callback(subreq, cleanupd_init_trigger, req);
760 return;
763 static bool cleanupd_init_recv(struct tevent_req *req)
765 struct cleanup_init_state *state = tevent_req_data(
766 req, struct cleanup_init_state);
768 return state->ok;
771 static void cleanupd_started(struct tevent_req *req)
773 bool ok;
774 NTSTATUS status;
775 struct smbd_parent_context *parent = tevent_req_callback_data(
776 req, struct smbd_parent_context);
778 ok = cleanupd_init_recv(req);
779 TALLOC_FREE(req);
780 if (!ok) {
781 DBG_ERR("Failed to restart cleanupd, giving up\n");
782 return;
785 status = messaging_send(parent->msg_ctx,
786 parent->cleanupd,
787 MSG_SMB_NOTIFY_CLEANUP,
788 &data_blob_null);
789 if (!NT_STATUS_IS_OK(status)) {
790 DBG_ERR("messaging_send returned %s\n",
791 nt_errstr(status));
795 static void remove_child_pid(struct smbd_parent_context *parent,
796 pid_t pid,
797 bool unclean_shutdown)
799 struct smbd_child_pid *child;
800 NTSTATUS status;
801 bool ok;
803 for (child = parent->children; child != NULL; child = child->next) {
804 if (child->pid == pid) {
805 struct smbd_child_pid *tmp = child;
806 DLIST_REMOVE(parent->children, child);
807 TALLOC_FREE(tmp);
808 parent->num_children -= 1;
809 break;
813 if (child == NULL) {
814 /* not all forked child processes are added to the children list */
815 DEBUG(2, ("Could not find child %d -- ignoring\n", (int)pid));
816 return;
819 if (pid == procid_to_pid(&parent->cleanupd)) {
820 struct tevent_req *req;
822 server_id_set_disconnected(&parent->cleanupd);
824 DBG_WARNING("Restarting cleanupd\n");
825 req = cleanupd_init_send(messaging_tevent_context(parent->msg_ctx),
826 parent,
827 parent->msg_ctx,
828 &parent->cleanupd);
829 if (req == NULL) {
830 DBG_ERR("Failed to restart cleanupd\n");
831 return;
833 tevent_req_set_callback(req, cleanupd_started, parent);
834 return;
837 if (pid == procid_to_pid(&parent->notifyd)) {
838 struct tevent_req *req;
839 struct tevent_context *ev = messaging_tevent_context(
840 parent->msg_ctx);
842 server_id_set_disconnected(&parent->notifyd);
844 DBG_WARNING("Restarting notifyd\n");
845 req = notifyd_init_send(ev,
846 parent,
847 parent->msg_ctx,
848 &parent->notifyd);
849 if (req == NULL) {
850 DBG_ERR("Failed to restart notifyd\n");
851 return;
853 tevent_req_set_callback(req, notifyd_started, parent);
854 return;
857 ok = cleanupdb_store_child(pid, unclean_shutdown);
858 if (!ok) {
859 DBG_ERR("cleanupdb_store_child failed\n");
860 return;
863 if (!server_id_is_disconnected(&parent->cleanupd)) {
864 status = messaging_send(parent->msg_ctx,
865 parent->cleanupd,
866 MSG_SMB_NOTIFY_CLEANUP,
867 &data_blob_null);
868 if (!NT_STATUS_IS_OK(status)) {
869 DBG_ERR("messaging_send returned %s\n",
870 nt_errstr(status));
875 /****************************************************************************
876 Have we reached the process limit ?
877 ****************************************************************************/
879 static bool allowable_number_of_smbd_processes(struct smbd_parent_context *parent)
881 int max_processes = lp_max_smbd_processes();
883 if (!max_processes)
884 return True;
886 return parent->num_children < max_processes;
889 static void smbd_sig_chld_handler(struct tevent_context *ev,
890 struct tevent_signal *se,
891 int signum,
892 int count,
893 void *siginfo,
894 void *private_data)
896 pid_t pid;
897 int status;
898 struct smbd_parent_context *parent =
899 talloc_get_type_abort(private_data,
900 struct smbd_parent_context);
902 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
903 bool unclean_shutdown = False;
905 /* If the child terminated normally, assume
906 it was an unclean shutdown unless the
907 status is 0
909 if (WIFEXITED(status)) {
910 unclean_shutdown = WEXITSTATUS(status);
912 /* If the child terminated due to a signal
913 we always assume it was unclean.
915 if (WIFSIGNALED(status)) {
916 unclean_shutdown = True;
918 remove_child_pid(parent, pid, unclean_shutdown);
922 static void smbd_setup_sig_chld_handler(struct smbd_parent_context *parent)
924 struct tevent_signal *se;
926 se = tevent_add_signal(parent->ev_ctx,
927 parent, /* mem_ctx */
928 SIGCHLD, 0,
929 smbd_sig_chld_handler,
930 parent);
931 if (!se) {
932 exit_server("failed to setup SIGCHLD handler");
936 static void smbd_open_socket_close_fn(struct tevent_context *ev,
937 struct tevent_fd *fde,
938 int fd,
939 void *private_data)
941 /* this might be the socket_wrapper swrap_close() */
942 close(fd);
945 static void smbd_accept_connection(struct tevent_context *ev,
946 struct tevent_fd *fde,
947 uint16_t flags,
948 void *private_data)
950 struct smbd_open_socket *s = talloc_get_type_abort(private_data,
951 struct smbd_open_socket);
952 struct messaging_context *msg_ctx = s->parent->msg_ctx;
953 struct dcesrv_context *dce_ctx = s->parent->dce_ctx;
954 struct sockaddr_storage addr;
955 socklen_t in_addrlen = sizeof(addr);
956 int fd;
957 pid_t pid = 0;
959 fd = accept(s->fd, (struct sockaddr *)(void *)&addr,&in_addrlen);
960 if (fd == -1 && errno == EINTR)
961 return;
963 if (fd == -1) {
964 DEBUG(0,("accept: %s\n",
965 strerror(errno)));
966 return;
968 smb_set_close_on_exec(fd);
970 if (s->parent->interactive) {
971 reinit_after_fork(msg_ctx, ev, true, NULL);
972 smbd_process(ev, msg_ctx, dce_ctx, fd, true);
973 exit_server_cleanly("end of interactive mode");
974 return;
977 if (!allowable_number_of_smbd_processes(s->parent)) {
978 close(fd);
979 return;
982 pid = fork();
983 if (pid == 0) {
984 NTSTATUS status = NT_STATUS_OK;
987 * Can't use TALLOC_FREE here. Nulling out the argument to it
988 * would overwrite memory we've just freed.
990 talloc_free(s->parent);
991 s = NULL;
993 /* Stop zombies, the parent explicitly handles
994 * them, counting worker smbds. */
995 CatchChild();
997 status = smbd_reinit_after_fork(msg_ctx, ev, true, NULL);
998 if (!NT_STATUS_IS_OK(status)) {
999 if (NT_STATUS_EQUAL(status,
1000 NT_STATUS_TOO_MANY_OPENED_FILES)) {
1001 DEBUG(0,("child process cannot initialize "
1002 "because too many files are open\n"));
1003 goto exit;
1005 if (lp_clustering() &&
1006 (NT_STATUS_EQUAL(
1007 status, NT_STATUS_INTERNAL_DB_ERROR) ||
1008 NT_STATUS_EQUAL(
1009 status, NT_STATUS_CONNECTION_REFUSED))) {
1010 DEBUG(1, ("child process cannot initialize "
1011 "because connection to CTDB "
1012 "has failed: %s\n",
1013 nt_errstr(status)));
1014 goto exit;
1017 DEBUG(0,("reinit_after_fork() failed\n"));
1018 smb_panic("reinit_after_fork() failed");
1021 smbd_process(ev, msg_ctx, dce_ctx, fd, false);
1022 exit:
1023 exit_server_cleanly("end of child");
1024 return;
1027 if (pid < 0) {
1028 DEBUG(0,("smbd_accept_connection: fork() failed: %s\n",
1029 strerror(errno)));
1032 /* The parent doesn't need this socket */
1033 close(fd);
1035 /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
1036 Clear the closed fd info out of server_fd --
1037 and more importantly, out of client_fd in
1038 util_sock.c, to avoid a possible
1039 getpeername failure if we reopen the logs
1040 and use %I in the filename.
1043 if (pid != 0) {
1044 add_child_pid(s->parent, pid);
1047 /* Force parent to check log size after
1048 * spawning child. Fix from
1049 * klausr@ITAP.Physik.Uni-Stuttgart.De. The
1050 * parent smbd will log to logserver.smb. It
1051 * writes only two messages for each child
1052 * started/finished. But each child writes,
1053 * say, 50 messages also in logserver.smb,
1054 * beginning with the debug_count of the
1055 * parent, before the child opens its own log
1056 * file logserver.client. In a worst case
1057 * scenario the size of logserver.smb would be
1058 * checked after about 50*50=2500 messages
1059 * (ca. 100kb).
1060 * */
1061 force_check_log_size();
1064 static bool smbd_open_one_socket(struct smbd_parent_context *parent,
1065 struct tevent_context *ev_ctx,
1066 const struct sockaddr_storage *ifss,
1067 uint16_t port)
1069 struct smbd_open_socket *s;
1071 s = talloc(parent, struct smbd_open_socket);
1072 if (!s) {
1073 return false;
1076 s->parent = parent;
1078 s->fd = open_socket_in(SOCK_STREAM, ifss, port, true);
1079 if (s->fd < 0) {
1080 int err = -(s->fd);
1081 DBG_ERR("open_socket_in failed: %s\n", strerror(err));
1082 TALLOC_FREE(s);
1084 * We ignore an error here, as we've done before
1086 return true;
1089 /* ready to listen */
1090 set_socket_options(s->fd, "SO_KEEPALIVE");
1091 set_socket_options(s->fd, lp_socket_options());
1093 /* Set server socket to
1094 * non-blocking for the accept. */
1095 set_blocking(s->fd, False);
1097 if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
1098 DEBUG(0,("smbd_open_one_socket: listen: "
1099 "%s\n", strerror(errno)));
1100 close(s->fd);
1101 TALLOC_FREE(s);
1102 return false;
1105 s->fde = tevent_add_fd(ev_ctx,
1107 s->fd, TEVENT_FD_READ,
1108 smbd_accept_connection,
1110 if (!s->fde) {
1111 DEBUG(0,("smbd_open_one_socket: "
1112 "tevent_add_fd: %s\n",
1113 strerror(errno)));
1114 close(s->fd);
1115 TALLOC_FREE(s);
1116 return false;
1118 tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
1120 DLIST_ADD_END(parent->sockets, s);
1122 return true;
1125 /****************************************************************************
1126 Open the socket communication.
1127 ****************************************************************************/
1129 static bool open_sockets_smbd(struct smbd_parent_context *parent,
1130 struct tevent_context *ev_ctx,
1131 struct messaging_context *msg_ctx,
1132 const char *smb_ports)
1134 int num_interfaces = iface_count();
1135 int i,j;
1136 const char **ports;
1137 unsigned dns_port = 0;
1139 #ifdef HAVE_ATEXIT
1140 atexit(killkids);
1141 #endif
1143 /* Stop zombies */
1144 smbd_setup_sig_chld_handler(parent);
1146 ports = lp_smb_ports();
1148 /* use a reasonable default set of ports - listing on 445 and 139 */
1149 if (smb_ports) {
1150 char **l;
1151 l = str_list_make_v3(talloc_tos(), smb_ports, NULL);
1152 ports = discard_const_p(const char *, l);
1155 for (j = 0; ports && ports[j]; j++) {
1156 unsigned port = atoi(ports[j]);
1158 if (port == 0 || port > 0xffff) {
1159 exit_server_cleanly("Invalid port in the config or on "
1160 "the commandline specified!");
1164 if (lp_interfaces() && lp_bind_interfaces_only()) {
1165 /* We have been given an interfaces line, and been
1166 told to only bind to those interfaces. Create a
1167 socket per interface and bind to only these.
1170 /* Now open a listen socket for each of the
1171 interfaces. */
1172 for(i = 0; i < num_interfaces; i++) {
1173 const struct sockaddr_storage *ifss =
1174 iface_n_sockaddr_storage(i);
1175 if (ifss == NULL) {
1176 DEBUG(0,("open_sockets_smbd: "
1177 "interface %d has NULL IP address !\n",
1178 i));
1179 continue;
1182 for (j = 0; ports && ports[j]; j++) {
1183 unsigned port = atoi(ports[j]);
1185 /* Keep the first port for mDNS service
1186 * registration.
1188 if (dns_port == 0) {
1189 dns_port = port;
1192 if (!smbd_open_one_socket(parent,
1193 ev_ctx,
1194 ifss,
1195 port)) {
1196 return false;
1200 } else {
1201 /* Just bind to 0.0.0.0 - accept connections
1202 from anywhere. */
1204 const char *sock_addr;
1205 char *sock_tok;
1206 const char *sock_ptr;
1208 #ifdef HAVE_IPV6
1209 sock_addr = "::,0.0.0.0";
1210 #else
1211 sock_addr = "0.0.0.0";
1212 #endif
1214 for (sock_ptr=sock_addr;
1215 next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
1216 for (j = 0; ports && ports[j]; j++) {
1217 struct sockaddr_storage ss;
1218 unsigned port = atoi(ports[j]);
1220 /* Keep the first port for mDNS service
1221 * registration.
1223 if (dns_port == 0) {
1224 dns_port = port;
1227 /* open an incoming socket */
1228 if (!interpret_string_addr(&ss, sock_tok,
1229 AI_NUMERICHOST|AI_PASSIVE)) {
1230 continue;
1234 * If we fail to open any sockets
1235 * in this loop the parent-sockets == NULL
1236 * case below will prevent us from starting.
1239 (void)smbd_open_one_socket(parent,
1240 ev_ctx,
1241 &ss,
1242 port);
1247 if (parent->sockets == NULL) {
1248 DEBUG(0,("open_sockets_smbd: No "
1249 "sockets available to bind to.\n"));
1250 return false;
1253 /* Listen to messages */
1255 messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server);
1256 messaging_register(msg_ctx, ev_ctx, MSG_SMB_CONF_UPDATED,
1257 smbd_parent_conf_updated);
1258 messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE,
1259 smb_stat_cache_delete);
1260 messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug);
1261 messaging_register(msg_ctx, NULL, MSG_SMB_FORCE_TDIS,
1262 smb_parent_send_to_children);
1263 messaging_register(msg_ctx, NULL, MSG_SMB_FORCE_TDIS_DENIED,
1264 smb_parent_send_to_children);
1265 messaging_register(msg_ctx, NULL, MSG_SMB_KILL_CLIENT_IP,
1266 smb_parent_send_to_children);
1267 messaging_register(msg_ctx, NULL, MSG_SMB_TELL_NUM_CHILDREN,
1268 smb_tell_num_children);
1270 messaging_register(msg_ctx, NULL,
1271 ID_CACHE_DELETE, smbd_parent_id_cache_delete);
1272 messaging_register(msg_ctx, NULL,
1273 ID_CACHE_KILL, smbd_parent_id_cache_kill);
1274 messaging_register(msg_ctx, NULL, MSG_SMB_NOTIFY_STARTED,
1275 smb_parent_send_to_children);
1277 #ifdef DEVELOPER
1278 messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT,
1279 msg_inject_fault);
1280 #endif
1282 #if defined(DEVELOPER) || defined(ENABLE_SELFTEST)
1283 messaging_register(msg_ctx, NULL, MSG_SMB_SLEEP, msg_sleep);
1284 #endif
1286 if (lp_multicast_dns_register() && (dns_port != 0)) {
1287 #ifdef WITH_DNSSD_SUPPORT
1288 smbd_setup_mdns_registration(ev_ctx,
1289 parent, dns_port);
1290 #endif
1291 #ifdef WITH_AVAHI_SUPPORT
1292 void *avahi_conn;
1294 avahi_conn = avahi_start_register(ev_ctx,
1295 ev_ctx,
1296 dns_port);
1297 if (avahi_conn == NULL) {
1298 DEBUG(10, ("avahi_start_register failed\n"));
1300 #endif
1303 return true;
1308 handle stdin becoming readable when we are in --foreground mode
1310 static void smbd_stdin_handler(struct tevent_context *ev,
1311 struct tevent_fd *fde,
1312 uint16_t flags,
1313 void *private_data)
1315 char c;
1316 if (read(0, &c, 1) != 1) {
1317 /* we have reached EOF on stdin, which means the
1318 parent has exited. Shutdown the server */
1319 exit_server_cleanly("EOF on stdin");
1323 struct smbd_parent_tevent_trace_state {
1324 TALLOC_CTX *frame;
1327 static void smbd_parent_tevent_trace_callback(enum tevent_trace_point point,
1328 void *private_data)
1330 struct smbd_parent_tevent_trace_state *state =
1331 (struct smbd_parent_tevent_trace_state *)private_data;
1333 switch (point) {
1334 case TEVENT_TRACE_BEFORE_WAIT:
1335 break;
1336 case TEVENT_TRACE_AFTER_WAIT:
1337 break;
1338 case TEVENT_TRACE_BEFORE_LOOP_ONCE:
1339 TALLOC_FREE(state->frame);
1340 state->frame = talloc_stackframe();
1341 break;
1342 case TEVENT_TRACE_AFTER_LOOP_ONCE:
1343 TALLOC_FREE(state->frame);
1344 break;
1347 errno = 0;
1350 static void smbd_parent_loop(struct tevent_context *ev_ctx,
1351 struct smbd_parent_context *parent)
1353 struct smbd_parent_tevent_trace_state trace_state = {
1354 .frame = NULL,
1356 int ret = 0;
1358 tevent_set_trace_callback(ev_ctx, smbd_parent_tevent_trace_callback,
1359 &trace_state);
1361 /* now accept incoming connections - forking a new process
1362 for each incoming connection */
1363 DEBUG(2,("waiting for connections\n"));
1365 ret = tevent_loop_wait(ev_ctx);
1366 if (ret != 0) {
1367 DEBUG(0, ("tevent_loop_wait failed: %d, %s, exiting\n",
1368 ret, strerror(errno)));
1371 TALLOC_FREE(trace_state.frame);
1373 /* NOTREACHED return True; */
1377 /****************************************************************************
1378 Initialise connect, service and file structs.
1379 ****************************************************************************/
1381 static bool init_structs(void )
1384 * Set the machine NETBIOS name if not already
1385 * set from the config file.
1388 if (!secrets_init())
1389 return False;
1391 return True;
1394 static void smbd_parent_sig_term_handler(struct tevent_context *ev,
1395 struct tevent_signal *se,
1396 int signum,
1397 int count,
1398 void *siginfo,
1399 void *private_data)
1401 exit_server_cleanly("termination signal");
1404 static void smbd_parent_sig_hup_handler(struct tevent_context *ev,
1405 struct tevent_signal *se,
1406 int signum,
1407 int count,
1408 void *siginfo,
1409 void *private_data)
1411 struct smbd_parent_context *parent =
1412 talloc_get_type_abort(private_data,
1413 struct smbd_parent_context);
1415 change_to_root_user();
1416 DEBUG(1,("parent: Reloading services after SIGHUP\n"));
1417 reload_services(NULL, NULL, false);
1419 printing_subsystem_update(parent->ev_ctx, parent->msg_ctx, true);
1422 struct smbd_claim_version_state {
1423 TALLOC_CTX *mem_ctx;
1424 char *version;
1427 static void smbd_claim_version_parser(struct server_id exclusive,
1428 size_t num_shared,
1429 struct server_id *shared,
1430 const uint8_t *data,
1431 size_t datalen,
1432 void *private_data)
1434 struct smbd_claim_version_state *state = private_data;
1436 if (datalen == 0) {
1437 state->version = NULL;
1438 return;
1440 if (data[datalen-1] != '\0') {
1441 DBG_WARNING("Invalid samba version\n");
1442 dump_data(DBGLVL_WARNING, data, datalen);
1443 state->version = NULL;
1444 return;
1446 state->version = talloc_strdup(state->mem_ctx, (const char *)data);
1449 static NTSTATUS smbd_claim_version(struct messaging_context *msg,
1450 const char *version)
1452 const char *name = "samba_version_string";
1453 const TDB_DATA key = string_term_tdb_data(name);
1454 struct smbd_claim_version_state state;
1455 struct g_lock_ctx *ctx;
1456 NTSTATUS status;
1458 ctx = g_lock_ctx_init(msg, msg);
1459 if (ctx == NULL) {
1460 DBG_WARNING("g_lock_ctx_init failed\n");
1461 return NT_STATUS_UNSUCCESSFUL;
1464 status = g_lock_lock(
1465 ctx, key, G_LOCK_READ, (struct timeval) { .tv_sec = 60 });
1466 if (!NT_STATUS_IS_OK(status)) {
1467 DBG_WARNING("g_lock_lock(G_LOCK_READ) failed: %s\n",
1468 nt_errstr(status));
1469 TALLOC_FREE(ctx);
1470 return status;
1473 state = (struct smbd_claim_version_state) { .mem_ctx = ctx };
1475 status = g_lock_dump(ctx, key, smbd_claim_version_parser, &state);
1476 if (!NT_STATUS_IS_OK(status) &&
1477 !NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
1478 DBG_ERR("Could not read samba_version_string\n");
1479 g_lock_unlock(ctx, key);
1480 TALLOC_FREE(ctx);
1481 return status;
1484 if ((state.version != NULL) && (strcmp(version, state.version) == 0)) {
1486 * Leave the read lock for us around. Someone else already
1487 * set the version correctly
1489 TALLOC_FREE(ctx);
1490 return NT_STATUS_OK;
1493 status = g_lock_lock(
1494 ctx, key, G_LOCK_UPGRADE, (struct timeval) { .tv_sec = 60 });
1495 if (!NT_STATUS_IS_OK(status)) {
1496 DBG_WARNING("g_lock_lock(G_LOCK_WRITE) failed: %s\n",
1497 nt_errstr(status));
1498 DBG_ERR("smbd %s already running, refusing to start "
1499 "version %s\n", state.version, version);
1500 TALLOC_FREE(ctx);
1501 return NT_STATUS_SXS_VERSION_CONFLICT;
1504 status = g_lock_write_data(
1505 ctx, key, (const uint8_t *)version, strlen(version)+1);
1506 if (!NT_STATUS_IS_OK(status)) {
1507 DBG_WARNING("g_lock_write_data failed: %s\n",
1508 nt_errstr(status));
1509 TALLOC_FREE(ctx);
1510 return status;
1513 status = g_lock_lock(
1514 ctx, key, G_LOCK_DOWNGRADE, (struct timeval) { .tv_sec = 60 });
1515 if (!NT_STATUS_IS_OK(status)) {
1516 DBG_WARNING("g_lock_lock(G_LOCK_READ) failed: %s\n",
1517 nt_errstr(status));
1518 TALLOC_FREE(ctx);
1519 return status;
1523 * Leave "ctx" dangling so that g_lock.tdb keeps opened.
1525 return NT_STATUS_OK;
1528 /****************************************************************************
1529 main program.
1530 ****************************************************************************/
1532 /* Declare prototype for build_options() to avoid having to run it through
1533 mkproto.h. Mixing $(builddir) and $(srcdir) source files in the current
1534 prototype generation system is too complicated. */
1536 extern void build_options(bool screen);
1538 int main(int argc,const char *argv[])
1540 /* shall I run as a daemon */
1541 struct samba_cmdline_daemon_cfg *cmdline_daemon_cfg = NULL;
1542 bool log_stdout = false;
1543 char *ports = NULL;
1544 char *profile_level = NULL;
1545 int opt;
1546 poptContext pc;
1547 bool print_build_options = False;
1548 bool serving_printers = false;
1549 struct server_id main_server_id = {0};
1550 struct poptOption long_options[] = {
1551 POPT_AUTOHELP
1553 .longName = "build-options",
1554 .shortName = 'b',
1555 .argInfo = POPT_ARG_NONE,
1556 .arg = NULL,
1557 .val = 'b',
1558 .descrip = "Print build options" ,
1561 .longName = "port",
1562 .shortName = 'p',
1563 .argInfo = POPT_ARG_STRING,
1564 .arg = &ports,
1565 .val = 0,
1566 .descrip = "Listen on the specified ports",
1569 .longName = "profiling-level",
1570 .shortName = 'P',
1571 .argInfo = POPT_ARG_STRING,
1572 .arg = &profile_level,
1573 .val = 0,
1574 .descrip = "Set profiling level","PROFILE_LEVEL",
1576 POPT_COMMON_SAMBA
1577 POPT_COMMON_DAEMON
1578 POPT_COMMON_VERSION
1579 POPT_TABLEEND
1581 struct smbd_parent_context *parent = NULL;
1582 TALLOC_CTX *frame;
1583 NTSTATUS status;
1584 struct tevent_context *ev_ctx;
1585 struct messaging_context *msg_ctx;
1586 struct dcesrv_context *dce_ctx = NULL;
1587 struct server_id server_id;
1588 struct tevent_signal *se;
1589 int profiling_level;
1590 char *np_dir = NULL;
1591 const struct loadparm_substitution *lp_sub =
1592 loadparm_s3_global_substitution();
1593 static const struct smbd_shim smbd_shim_fns =
1595 .send_stat_cache_delete_message = smbd_send_stat_cache_delete_message,
1596 .change_to_root_user = smbd_change_to_root_user,
1597 .become_authenticated_pipe_user = smbd_become_authenticated_pipe_user,
1598 .unbecome_authenticated_pipe_user = smbd_unbecome_authenticated_pipe_user,
1600 .contend_level2_oplocks_begin = smbd_contend_level2_oplocks_begin,
1601 .contend_level2_oplocks_end = smbd_contend_level2_oplocks_end,
1603 .become_root = smbd_become_root,
1604 .unbecome_root = smbd_unbecome_root,
1606 .exit_server = smbd_exit_server,
1607 .exit_server_cleanly = smbd_exit_server_cleanly,
1609 bool ok;
1612 * Do this before any other talloc operation
1614 talloc_enable_null_tracking();
1615 frame = talloc_stackframe();
1617 smb_init_locale();
1619 set_smbd_shim(&smbd_shim_fns);
1621 smbd_init_globals();
1623 TimeInit();
1625 #ifdef HAVE_SET_AUTH_PARAMETERS
1626 set_auth_parameters(argc,argv);
1627 #endif
1629 ok = samba_cmdline_init(frame,
1630 SAMBA_CMDLINE_CONFIG_SERVER,
1631 true /* require_smbconf */);
1632 if (!ok) {
1633 DBG_ERR("Failed to setup cmdline parser!\n");
1634 exit(ENOMEM);
1637 cmdline_daemon_cfg = samba_cmdline_get_daemon_cfg();
1639 pc = samba_popt_get_context(getprogname(),
1640 argc,
1641 argv,
1642 long_options,
1644 if (pc == NULL) {
1645 DBG_ERR("Failed to get popt context!\n");
1646 exit(ENOMEM);
1649 while((opt = poptGetNextOpt(pc)) != -1) {
1650 switch (opt) {
1651 case 'b':
1652 print_build_options = True;
1653 break;
1654 default:
1655 d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
1656 poptBadOption(pc, 0), poptStrerror(opt));
1657 poptPrintUsage(pc, stderr, 0);
1658 exit(1);
1661 poptFreeContext(pc);
1663 log_stdout = (debug_get_log_type() == DEBUG_STDOUT);
1665 if (cmdline_daemon_cfg->interactive) {
1666 log_stdout = True;
1669 if (print_build_options) {
1670 build_options(True); /* Display output to screen as well as debug */
1671 exit(0);
1674 #ifdef HAVE_SETLUID
1675 /* needed for SecureWare on SCO */
1676 setluid(0);
1677 #endif
1679 set_remote_machine_name("smbd", False);
1681 if (cmdline_daemon_cfg->interactive && (DEBUGLEVEL >= 9)) {
1682 talloc_enable_leak_report();
1685 if (log_stdout && cmdline_daemon_cfg->fork) {
1686 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
1687 exit(1);
1691 * We want to die early if we can't open /dev/urandom
1693 generate_random_buffer(NULL, 0);
1695 /* get initial effective uid and gid */
1696 sec_init();
1698 /* make absolutely sure we run as root - to handle cases where people
1699 are crazy enough to have it setuid */
1700 gain_root_privilege();
1701 gain_root_group_privilege();
1703 dump_core_setup("smbd", lp_logfile(talloc_tos(), lp_sub));
1705 /* we are never interested in SIGPIPE */
1706 BlockSignals(True,SIGPIPE);
1708 #if defined(SIGFPE)
1709 /* we are never interested in SIGFPE */
1710 BlockSignals(True,SIGFPE);
1711 #endif
1713 #if defined(SIGUSR2)
1714 /* We are no longer interested in USR2 */
1715 BlockSignals(True,SIGUSR2);
1716 #endif
1719 * POSIX demands that signals are inherited. If the invoking
1720 * process has these signals masked, we will have problems, as
1721 * we won't receive them.
1723 BlockSignals(False, SIGHUP);
1724 BlockSignals(False, SIGUSR1);
1725 BlockSignals(False, SIGTERM);
1727 /* Ensure we leave no zombies until we
1728 * correctly set up child handling below. */
1730 CatchChild();
1732 /* we want total control over the permissions on created files,
1733 so set our umask to 0 */
1734 umask(0);
1736 reopen_logs();
1738 DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1739 DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1741 DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1742 (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1744 /* Output the build options to the debug log */
1745 build_options(False);
1747 if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4) {
1748 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1749 exit(1);
1753 * This calls unshare(CLONE_FS); on linux
1754 * in order to check if the running kernel/container
1755 * environment supports it.
1757 per_thread_cwd_check();
1759 if (!cluster_probe_ok()) {
1760 exit(1);
1763 /* Init the security context and global current_user */
1764 init_sec_ctx();
1767 * Initialize the event context. The event context needs to be
1768 * initialized before the messaging context, cause the messaging
1769 * context holds an event context.
1771 ev_ctx = global_event_context();
1772 if (ev_ctx == NULL) {
1773 exit(1);
1777 * Init the messaging context
1778 * FIXME: This should only call messaging_init()
1780 msg_ctx = global_messaging_context();
1781 if (msg_ctx == NULL) {
1782 exit(1);
1785 dce_ctx = global_dcesrv_context();
1786 if (dce_ctx == NULL) {
1787 exit(1);
1791 * Reloading of the printers will not work here as we don't have a
1792 * server info and rpc services set up. It will be called later.
1794 if (!reload_services(NULL, NULL, false)) {
1795 exit(1);
1798 if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) {
1799 if (!lp_parm_bool(-1, "server role check", "inhibit", false)) {
1800 DBG_ERR("server role = 'active directory domain controller' not compatible with running smbd standalone. \n");
1801 DEBUGADD(0, ("You should start 'samba' instead, and it will control starting smbd if required\n"));
1802 exit(1);
1804 /* Main 'samba' daemon will notify */
1805 daemon_sd_notifications(false);
1808 /* ...NOTE... Log files are working from this point! */
1810 DEBUG(3,("loaded services\n"));
1812 init_structs();
1814 if (!profile_setup(msg_ctx, False)) {
1815 DEBUG(0,("ERROR: failed to setup profiling\n"));
1816 return -1;
1819 if (profile_level != NULL) {
1820 profiling_level = atoi(profile_level);
1821 } else {
1822 profiling_level = lp_smbd_profiling_level();
1824 main_server_id = messaging_server_id(msg_ctx);
1825 set_profile_level(profiling_level, &main_server_id);
1827 if (!cmdline_daemon_cfg->daemon && !is_a_socket(0)) {
1828 if (!cmdline_daemon_cfg->interactive) {
1829 DEBUG(3, ("Standard input is not a socket, "
1830 "assuming -D option\n"));
1834 * Setting "daemon" here prevents us from eventually calling
1835 * the open_sockets_inetd()
1838 cmdline_daemon_cfg->daemon = true;
1841 if (cmdline_daemon_cfg->daemon && !cmdline_daemon_cfg->interactive) {
1842 DEBUG(3, ("Becoming a daemon.\n"));
1843 become_daemon(cmdline_daemon_cfg->fork,
1844 cmdline_daemon_cfg->no_process_group,
1845 log_stdout);
1846 } else {
1847 daemon_status("smbd", "Starting process ...");
1850 #ifdef HAVE_SETPGID
1852 * If we're interactive we want to set our own process group for
1853 * signal management.
1855 if (cmdline_daemon_cfg->interactive &&
1856 !cmdline_daemon_cfg->no_process_group)
1858 setpgid( (pid_t)0, (pid_t)0);
1860 #endif
1862 if (!directory_exist(lp_lock_directory()))
1863 mkdir(lp_lock_directory(), 0755);
1865 if (!directory_exist(lp_pid_directory()))
1866 mkdir(lp_pid_directory(), 0755);
1868 if (cmdline_daemon_cfg->daemon)
1869 pidfile_create(lp_pid_directory(), "smbd");
1871 status = reinit_after_fork(msg_ctx, ev_ctx, false, NULL);
1872 if (!NT_STATUS_IS_OK(status)) {
1873 exit_daemon("reinit_after_fork() failed", map_errno_from_nt_status(status));
1876 if (!cmdline_daemon_cfg->interactive) {
1878 * Do not initialize the parent-child-pipe before becoming a
1879 * daemon: this is used to detect a died parent in the child
1880 * process.
1882 status = init_before_fork();
1883 if (!NT_STATUS_IS_OK(status)) {
1884 exit_daemon(nt_errstr(status), map_errno_from_nt_status(status));
1888 parent = talloc_zero(ev_ctx, struct smbd_parent_context);
1889 if (!parent) {
1890 exit_server("talloc(struct smbd_parent_context) failed");
1892 parent->interactive = cmdline_daemon_cfg->interactive;
1893 parent->ev_ctx = ev_ctx;
1894 parent->msg_ctx = msg_ctx;
1895 parent->dce_ctx = dce_ctx;
1896 am_parent = parent;
1898 se = tevent_add_signal(parent->ev_ctx,
1899 parent,
1900 SIGTERM, 0,
1901 smbd_parent_sig_term_handler,
1902 parent);
1903 if (!se) {
1904 exit_server("failed to setup SIGTERM handler");
1906 se = tevent_add_signal(parent->ev_ctx,
1907 parent,
1908 SIGHUP, 0,
1909 smbd_parent_sig_hup_handler,
1910 parent);
1911 if (!se) {
1912 exit_server("failed to setup SIGHUP handler");
1915 /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1917 if (smbd_memcache() == NULL) {
1918 exit_daemon("no memcache available", EACCES);
1921 memcache_set_global(smbd_memcache());
1923 /* Initialise the password backed before the global_sam_sid
1924 to ensure that we fetch from ldap before we make a domain sid up */
1926 if(!initialize_password_db(false, ev_ctx))
1927 exit(1);
1929 if (!secrets_init()) {
1930 exit_daemon("smbd can not open secrets.tdb", EACCES);
1933 if (lp_server_role() == ROLE_DOMAIN_BDC || lp_server_role() == ROLE_DOMAIN_PDC || lp_server_role() == ROLE_IPA_DC) {
1934 struct loadparm_context *lp_ctx = loadparm_init_s3(NULL, loadparm_s3_helpers());
1935 if (!open_schannel_session_store(NULL, lp_ctx)) {
1936 exit_daemon("ERROR: Samba cannot open schannel store for secured NETLOGON operations.", EACCES);
1938 TALLOC_FREE(lp_ctx);
1941 if(!get_global_sam_sid()) {
1942 exit_daemon("Samba cannot create a SAM SID", EACCES);
1945 server_id = messaging_server_id(msg_ctx);
1946 status = smbXsrv_version_global_init(&server_id);
1947 if (!NT_STATUS_IS_OK(status)) {
1948 exit_daemon("Samba cannot init server context", EACCES);
1951 status = smbXsrv_client_global_init();
1952 if (!NT_STATUS_IS_OK(status)) {
1953 exit_daemon("Samba cannot init clients context", EACCES);
1956 status = smbXsrv_session_global_init(msg_ctx);
1957 if (!NT_STATUS_IS_OK(status)) {
1958 exit_daemon("Samba cannot init session context", EACCES);
1961 status = smbXsrv_tcon_global_init();
1962 if (!NT_STATUS_IS_OK(status)) {
1963 exit_daemon("Samba cannot init tcon context", EACCES);
1966 if (!locking_init())
1967 exit_daemon("Samba cannot init locking", EACCES);
1969 if (!leases_db_init(false)) {
1970 exit_daemon("Samba cannot init leases", EACCES);
1973 if (!smbd_notifyd_init(
1974 msg_ctx,
1975 cmdline_daemon_cfg->interactive,
1976 &parent->notifyd)) {
1977 exit_daemon("Samba cannot init notification", EACCES);
1980 if (!cleanupd_init(
1981 msg_ctx,
1982 cmdline_daemon_cfg->interactive,
1983 &parent->cleanupd)) {
1984 exit_daemon("Samba cannot init the cleanupd", EACCES);
1987 if (!messaging_parent_dgm_cleanup_init(msg_ctx)) {
1988 exit(1);
1991 if (!smbd_scavenger_init(NULL, msg_ctx, ev_ctx)) {
1992 exit_daemon("Samba cannot init scavenging", EACCES);
1995 if (!W_ERROR_IS_OK(registry_init_full()))
1996 exit_daemon("Samba cannot init registry", EACCES);
1998 /* Open the share_info.tdb here, so we don't have to open
1999 after the fork on every single connection. This is a small
2000 performance improvment and reduces the total number of system
2001 fds used. */
2002 status = share_info_db_init();
2003 if (!NT_STATUS_IS_OK(status)) {
2004 exit_daemon("ERROR: failed to load share info db.", EACCES);
2007 status = init_system_session_info(NULL);
2008 if (!NT_STATUS_IS_OK(status)) {
2009 DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
2010 nt_errstr(status)));
2011 return -1;
2014 if (!init_guest_session_info(NULL)) {
2015 DEBUG(0,("ERROR: failed to setup guest info.\n"));
2016 return -1;
2019 if (!file_init_global()) {
2020 DEBUG(0, ("ERROR: file_init_global() failed\n"));
2021 return -1;
2023 status = smbXsrv_open_global_init();
2024 if (!NT_STATUS_IS_OK(status)) {
2025 exit_daemon("Samba cannot init global open", map_errno_from_nt_status(status));
2028 if (lp_clustering() && !lp_allow_unsafe_cluster_upgrade()) {
2029 status = smbd_claim_version(msg_ctx, samba_version_string());
2030 if (!NT_STATUS_IS_OK(status)) {
2031 DBG_ERR("Could not claim version: %s\n",
2032 nt_errstr(status));
2033 return -1;
2037 /* This MUST be done before start_epmd() because otherwise
2038 * start_epmd() forks and races against dcesrv_ep_setup() to
2039 * call directory_create_or_exist() */
2040 if (!directory_create_or_exist(lp_ncalrpc_dir(), 0755)) {
2041 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
2042 lp_ncalrpc_dir(), strerror(errno)));
2043 return -1;
2046 np_dir = talloc_asprintf(talloc_tos(), "%s/np", lp_ncalrpc_dir());
2047 if (!np_dir) {
2048 DEBUG(0, ("%s: Out of memory\n", __location__));
2049 return -1;
2052 if (!directory_create_or_exist_strict(np_dir, geteuid(), 0700)) {
2053 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
2054 np_dir, strerror(errno)));
2055 return -1;
2058 status = dcesrv_init(ev_ctx, ev_ctx, msg_ctx, dce_ctx);
2059 if (!NT_STATUS_IS_OK(status)) {
2060 DBG_ERR("Failed to setup RPC server: %s\n", nt_errstr(status));
2061 exit_daemon("Samba cannot setup ep pipe", EACCES);
2064 if (!cmdline_daemon_cfg->interactive) {
2065 daemon_ready("smbd");
2068 serving_printers = (!lp__disable_spoolss() &&
2069 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED));
2071 /* only start other daemons if we are running as a daemon
2072 * -- bad things will happen if smbd is launched via inetd
2073 * and we fork a copy of ourselves here */
2074 if (cmdline_daemon_cfg->daemon && !cmdline_daemon_cfg->interactive) {
2076 if (rpc_epmapper_daemon() == RPC_DAEMON_FORK) {
2077 start_epmd(ev_ctx, msg_ctx, dce_ctx);
2080 if (rpc_lsasd_daemon() == RPC_DAEMON_FORK) {
2081 start_lsasd(ev_ctx, msg_ctx, dce_ctx);
2084 if (rpc_fss_daemon() == RPC_DAEMON_FORK) {
2085 start_fssd(ev_ctx, msg_ctx, dce_ctx);
2088 if (serving_printers) {
2089 bool bgq = lp_parm_bool(-1, "smbd", "backgroundqueue", true);
2090 ok = printing_subsystem_init(ev_ctx,
2091 msg_ctx,
2092 dce_ctx,
2093 true,
2094 bgq);
2095 if (!ok) {
2096 exit_daemon("Samba failed to init printing subsystem", EACCES);
2100 #ifdef WITH_SPOTLIGHT
2101 if ((rpc_mdssvc_mode() == RPC_SERVICE_MODE_EXTERNAL) &&
2102 (rpc_mdssd_daemon() == RPC_DAEMON_FORK)) {
2103 start_mdssd(ev_ctx, msg_ctx, dce_ctx);
2105 #endif
2106 } else if (serving_printers) {
2107 ok = printing_subsystem_init(ev_ctx,
2108 msg_ctx,
2109 dce_ctx,
2110 false,
2111 false);
2112 if (!ok) {
2113 exit(1);
2117 if (!cmdline_daemon_cfg->daemon) {
2118 int ret, sock;
2120 /* inetd mode */
2121 TALLOC_FREE(frame);
2123 /* Started from inetd. fd 0 is the socket. */
2124 /* We will abort gracefully when the client or remote system
2125 goes away */
2126 sock = dup(0);
2128 /* close stdin, stdout (if not logging to it), but not stderr */
2129 ret = close_low_fd(0);
2130 if (ret != 0) {
2131 DBG_ERR("close_low_fd(0) failed: %s\n", strerror(ret));
2132 return 1;
2134 if (!debug_get_output_is_stdout()) {
2135 ret = close_low_fd(1);
2136 if (ret != 0) {
2137 DBG_ERR("close_low_fd(1) failed: %s\n",
2138 strerror(ret));
2139 return 1;
2143 #ifdef HAVE_ATEXIT
2144 atexit(killkids);
2145 #endif
2147 /* Stop zombies */
2148 smbd_setup_sig_chld_handler(parent);
2150 smbd_process(ev_ctx, msg_ctx, dce_ctx, sock, true);
2152 exit_server_cleanly(NULL);
2153 return(0);
2156 if (!open_sockets_smbd(parent, ev_ctx, msg_ctx, ports))
2157 exit_server("open_sockets_smbd() failed");
2159 /* do a printer update now that all messaging has been set up,
2160 * before we allow clients to start connecting */
2161 if (!lp__disable_spoolss() &&
2162 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED)) {
2163 printing_subsystem_update(ev_ctx, msg_ctx, false);
2166 TALLOC_FREE(frame);
2167 /* make sure we always have a valid stackframe */
2168 frame = talloc_stackframe();
2170 if (!cmdline_daemon_cfg->fork) {
2171 /* if we are running in the foreground then look for
2172 EOF on stdin, and exit if it happens. This allows
2173 us to die if the parent process dies
2174 Only do this on a pipe or socket, no other device.
2176 struct stat st;
2177 if (fstat(0, &st) != 0) {
2178 return false;
2180 if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
2181 tevent_add_fd(ev_ctx,
2182 parent,
2184 TEVENT_FD_READ,
2185 smbd_stdin_handler,
2186 NULL);
2190 smbd_parent_loop(ev_ctx, parent);
2192 exit_server_cleanly(NULL);
2193 TALLOC_FREE(frame);
2194 return(0);