2 Unix SMB/CIFS implementation.
3 Main SMB server routines
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Martin Pool 2002
6 Copyright (C) Jelmer Vernooij 2002-2003
7 Copyright (C) Volker Lendecke 1993-2007
8 Copyright (C) Jeremy Allison 1993-2007
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "system/filesys.h"
26 #include "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"
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"
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"
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"
68 struct smbd_open_socket
;
69 struct smbd_child_pid
;
71 struct smbd_parent_context
{
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
;
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
;
95 struct tevent_fd
*fde
;
98 struct smbd_child_pid
{
99 struct smbd_child_pid
*prev
, *next
;
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
,
113 struct server_id server_id
,
116 struct tevent_context
*ev_ctx
=
117 talloc_get_type_abort(private_data
, struct tevent_context
);
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
);
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
,
140 struct server_id server_id
,
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
,
160 struct server_id server_id
,
163 DEBUG(3, ("got a SHUTDOWN message\n"));
164 exit_server_cleanly(NULL
);
168 static void msg_inject_fault(struct messaging_context
*msg
,
171 struct server_id src
,
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
)));
183 sig
= *(int *)data
->data
;
185 exit_server("internal error injected");
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
)));
193 DEBUG(0, ("Process %s requested injection of signal %d\n",
194 server_id_str_buf(src
, &tmp
), 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
,
208 struct server_id src
,
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
));
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
),
225 DBG_ERR("Restarting after %u second sleep requested by process %s\n",
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
)
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
),
246 if (!NT_STATUS_IS_OK(status
)) {
247 DBG_DEBUG("messaging_send(%d) failed: %s\n",
248 (int)child
->pid
, nt_errstr(status
));
254 static void smb_parent_send_to_children(struct messaging_context
*ctx
,
257 struct server_id srv_id
,
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
,
272 struct server_id server_id
,
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
,
283 struct server_id server_id
,
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
));
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
,
303 struct server_id srv_id
,
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
,
314 struct smbd_child_pid
*child
;
316 child
= talloc_zero(parent
, struct smbd_child_pid
);
318 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
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
,
330 uint8_t buf
[sizeof(uint32_t)];
333 SIVAL(buf
, 0, am_parent
->num_children
);
334 messaging_send_buf(ctx
, srv_id
, MSG_SMB_NUM_CHILDREN
,
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()) {
352 if (lp_parm_bool(-1, "notify", "inotify", true)) {
353 sys_notify_watch
= inotify_watch
;
358 if (lp_parm_bool(-1, "notify", "fam",
359 (sys_notify_watch
== NULL
))) {
360 sys_notify_watch
= fam_watch
;
365 if (sys_notify_watch
!= NULL
) {
366 sys_notify_ctx
= sys_notify_context_create(msg_ctx
, ev
);
367 if (sys_notify_ctx
== 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
);
379 TALLOC_FREE(sys_notify_ctx
);
382 tevent_req_set_callback(req
, notifyd_stopped
, msg_ctx
);
387 static void notifyd_stopped(struct tevent_req
*req
)
391 ret
= notifyd_recv(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
,
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
;
415 struct tevent_signal
*se
;
418 req
= notifyd_req(msg
, ev
);
419 return (req
!= NULL
);
424 DEBUG(1, ("%s: fork failed: %s\n", __func__
,
430 if (am_parent
!= NULL
) {
431 add_child_pid(am_parent
, pid
);
433 *ppid
= pid_to_procid(pid
);
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
)));
446 /* Set up sighup handler for notifyd */
447 se
= tevent_add_signal(ev
,
450 notifyd_sig_hup_handler
,
453 DEBUG(0, ("failed to setup notifyd SIGHUP handler\n"));
457 req
= notifyd_req(msg
, ev
);
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
,
469 ok
= tevent_req_poll(req
, ev
);
471 DBG_WARNING("tevent_req_poll returned %s\n", strerror(errno
));
477 static void notifyd_init_trigger(struct tevent_req
*req
);
479 struct notifyd_init_state
{
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
,
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
);
500 *state
= (struct notifyd_init_state
) {
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
);
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
);
523 DBG_NOTICE("Triggering notifyd startup\n");
525 ok
= tevent_wakeup_recv(subreq
);
528 tevent_req_error(req
, ENOMEM
);
532 state
->ok
= smbd_notifyd_init(state
->msg
, false, state
->ppid
);
534 DBG_WARNING("notifyd restarted\n");
535 tevent_req_done(req
);
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");
548 tevent_req_set_callback(subreq
, notifyd_init_trigger
, req
);
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
);
560 static void notifyd_started(struct tevent_req
*req
)
564 ok
= notifyd_init_recv(req
);
567 DBG_ERR("Failed to restart notifyd, giving up\n");
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
;
589 req
= smbd_cleanupd_send(msg
, ev
, msg
, parent_id
.pid
);
590 *ppid
= messaging_server_id(msg
);
591 return (req
!= NULL
);
596 DBG_WARNING("pipe failed: %s\n", strerror(errno
));
602 DBG_WARNING("fork failed: %s\n", strerror(errno
));
611 rwret
= sys_read(up_pipe
[0], &c
, 1);
615 DBG_WARNING("sys_read failed: %s\n", strerror(errno
));
619 DBG_WARNING("cleanupd could not start\n");
623 DBG_WARNING("cleanupd returned %d\n", (int)c
);
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
);
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",
644 sys_write(up_pipe
[1], &c
, 1);
649 req
= smbd_cleanupd_send(msg
, ev
, msg
, parent_id
.pid
);
651 DBG_WARNING("smbd_cleanupd_send failed\n");
653 sys_write(up_pipe
[1], &c
, 1);
658 tevent_req_set_callback(req
, cleanupd_stopped
, msg
);
661 rwret
= sys_write(up_pipe
[1], &c
, 1);
665 DBG_WARNING("sys_write failed: %s\n", strerror(errno
));
669 DBG_WARNING("sys_write could not write result\n");
673 ok
= tevent_req_poll(req
, ev
);
675 DBG_WARNING("tevent_req_poll returned %s\n", strerror(errno
));
680 static void cleanupd_stopped(struct tevent_req
*req
)
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
{
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
,
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
);
711 *state
= (struct cleanup_init_state
) {
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
);
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
);
734 DBG_NOTICE("Triggering cleanupd startup\n");
736 ok
= tevent_wakeup_recv(subreq
);
739 tevent_req_error(req
, ENOMEM
);
743 state
->ok
= cleanupd_init(state
->msg
, false, state
->ppid
);
745 DBG_WARNING("cleanupd restarted\n");
746 tevent_req_done(req
);
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");
759 tevent_req_set_callback(subreq
, cleanupd_init_trigger
, req
);
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
);
771 static void cleanupd_started(struct tevent_req
*req
)
775 struct smbd_parent_context
*parent
= tevent_req_callback_data(
776 req
, struct smbd_parent_context
);
778 ok
= cleanupd_init_recv(req
);
781 DBG_ERR("Failed to restart cleanupd, giving up\n");
785 status
= messaging_send(parent
->msg_ctx
,
787 MSG_SMB_NOTIFY_CLEANUP
,
789 if (!NT_STATUS_IS_OK(status
)) {
790 DBG_ERR("messaging_send returned %s\n",
795 static void remove_child_pid(struct smbd_parent_context
*parent
,
797 bool unclean_shutdown
)
799 struct smbd_child_pid
*child
;
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
);
808 parent
->num_children
-= 1;
814 /* not all forked child processes are added to the children list */
815 DEBUG(2, ("Could not find child %d -- ignoring\n", (int)pid
));
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
),
830 DBG_ERR("Failed to restart cleanupd\n");
833 tevent_req_set_callback(req
, cleanupd_started
, parent
);
837 if (pid
== procid_to_pid(&parent
->notifyd
)) {
838 struct tevent_req
*req
;
839 struct tevent_context
*ev
= messaging_tevent_context(
842 server_id_set_disconnected(&parent
->notifyd
);
844 DBG_WARNING("Restarting notifyd\n");
845 req
= notifyd_init_send(ev
,
850 DBG_ERR("Failed to restart notifyd\n");
853 tevent_req_set_callback(req
, notifyd_started
, parent
);
857 ok
= cleanupdb_store_child(pid
, unclean_shutdown
);
859 DBG_ERR("cleanupdb_store_child failed\n");
863 if (!server_id_is_disconnected(&parent
->cleanupd
)) {
864 status
= messaging_send(parent
->msg_ctx
,
866 MSG_SMB_NOTIFY_CLEANUP
,
868 if (!NT_STATUS_IS_OK(status
)) {
869 DBG_ERR("messaging_send returned %s\n",
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();
886 return parent
->num_children
< max_processes
;
889 static void smbd_sig_chld_handler(struct tevent_context
*ev
,
890 struct tevent_signal
*se
,
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
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 */
929 smbd_sig_chld_handler
,
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
,
941 /* this might be the socket_wrapper swrap_close() */
945 static void smbd_accept_connection(struct tevent_context
*ev
,
946 struct tevent_fd
*fde
,
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
);
959 fd
= accept(s
->fd
, (struct sockaddr
*)(void *)&addr
,&in_addrlen
);
960 if (fd
== -1 && errno
== EINTR
)
964 DEBUG(0,("accept: %s\n",
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");
977 if (!allowable_number_of_smbd_processes(s
->parent
)) {
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
);
993 /* Stop zombies, the parent explicitly handles
994 * them, counting worker smbds. */
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"));
1005 if (lp_clustering() &&
1007 status
, NT_STATUS_INTERNAL_DB_ERROR
) ||
1009 status
, NT_STATUS_CONNECTION_REFUSED
))) {
1010 DEBUG(1, ("child process cannot initialize "
1011 "because connection to CTDB "
1013 nt_errstr(status
)));
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);
1023 exit_server_cleanly("end of child");
1028 DEBUG(0,("smbd_accept_connection: fork() failed: %s\n",
1032 /* The parent doesn't need this socket */
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.
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
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
,
1069 struct smbd_open_socket
*s
;
1071 s
= talloc(parent
, struct smbd_open_socket
);
1078 s
->fd
= open_socket_in(SOCK_STREAM
, ifss
, port
, true);
1081 DBG_ERR("open_socket_in failed: %s\n", strerror(err
));
1084 * We ignore an error here, as we've done before
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
)));
1105 s
->fde
= tevent_add_fd(ev_ctx
,
1107 s
->fd
, TEVENT_FD_READ
,
1108 smbd_accept_connection
,
1111 DEBUG(0,("smbd_open_one_socket: "
1112 "tevent_add_fd: %s\n",
1118 tevent_fd_set_close_fn(s
->fde
, smbd_open_socket_close_fn
);
1120 DLIST_ADD_END(parent
->sockets
, s
);
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();
1137 unsigned dns_port
= 0;
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 */
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
1172 for(i
= 0; i
< num_interfaces
; i
++) {
1173 const struct sockaddr_storage
*ifss
=
1174 iface_n_sockaddr_storage(i
);
1176 DEBUG(0,("open_sockets_smbd: "
1177 "interface %d has NULL IP address !\n",
1182 for (j
= 0; ports
&& ports
[j
]; j
++) {
1183 unsigned port
= atoi(ports
[j
]);
1185 /* Keep the first port for mDNS service
1188 if (dns_port
== 0) {
1192 if (!smbd_open_one_socket(parent
,
1201 /* Just bind to 0.0.0.0 - accept connections
1204 const char *sock_addr
;
1206 const char *sock_ptr
;
1209 sock_addr
= "::,0.0.0.0";
1211 sock_addr
= "0.0.0.0";
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
1223 if (dns_port
== 0) {
1227 /* open an incoming socket */
1228 if (!interpret_string_addr(&ss
, sock_tok
,
1229 AI_NUMERICHOST
|AI_PASSIVE
)) {
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
,
1247 if (parent
->sockets
== NULL
) {
1248 DEBUG(0,("open_sockets_smbd: No "
1249 "sockets available to bind to.\n"));
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
);
1278 messaging_register(msg_ctx
, NULL
, MSG_SMB_INJECT_FAULT
,
1282 #if defined(DEVELOPER) || defined(ENABLE_SELFTEST)
1283 messaging_register(msg_ctx
, NULL
, MSG_SMB_SLEEP
, msg_sleep
);
1286 if (lp_multicast_dns_register() && (dns_port
!= 0)) {
1287 #ifdef WITH_DNSSD_SUPPORT
1288 smbd_setup_mdns_registration(ev_ctx
,
1291 #ifdef WITH_AVAHI_SUPPORT
1294 avahi_conn
= avahi_start_register(ev_ctx
,
1297 if (avahi_conn
== NULL
) {
1298 DEBUG(10, ("avahi_start_register failed\n"));
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
,
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
{
1327 static void smbd_parent_tevent_trace_callback(enum tevent_trace_point point
,
1330 struct smbd_parent_tevent_trace_state
*state
=
1331 (struct smbd_parent_tevent_trace_state
*)private_data
;
1334 case TEVENT_TRACE_BEFORE_WAIT
:
1336 case TEVENT_TRACE_AFTER_WAIT
:
1338 case TEVENT_TRACE_BEFORE_LOOP_ONCE
:
1339 TALLOC_FREE(state
->frame
);
1340 state
->frame
= talloc_stackframe();
1342 case TEVENT_TRACE_AFTER_LOOP_ONCE
:
1343 TALLOC_FREE(state
->frame
);
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
= {
1358 tevent_set_trace_callback(ev_ctx
, smbd_parent_tevent_trace_callback
,
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
);
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())
1394 static void smbd_parent_sig_term_handler(struct tevent_context
*ev
,
1395 struct tevent_signal
*se
,
1401 exit_server_cleanly("termination signal");
1404 static void smbd_parent_sig_hup_handler(struct tevent_context
*ev
,
1405 struct tevent_signal
*se
,
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
;
1427 static void smbd_claim_version_parser(struct server_id exclusive
,
1429 struct server_id
*shared
,
1430 const uint8_t *data
,
1434 struct smbd_claim_version_state
*state
= private_data
;
1437 state
->version
= NULL
;
1440 if (data
[datalen
-1] != '\0') {
1441 DBG_WARNING("Invalid samba version\n");
1442 dump_data(DBGLVL_WARNING
, data
, datalen
);
1443 state
->version
= NULL
;
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
;
1458 ctx
= g_lock_ctx_init(msg
, msg
);
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",
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
);
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
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",
1498 DBG_ERR("smbd %s already running, refusing to start "
1499 "version %s\n", state
.version
, version
);
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",
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",
1523 * Leave "ctx" dangling so that g_lock.tdb keeps opened.
1525 return NT_STATUS_OK
;
1528 /****************************************************************************
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;
1544 char *profile_level
= NULL
;
1547 bool print_build_options
= False
;
1548 bool serving_printers
= false;
1549 struct server_id main_server_id
= {0};
1550 struct poptOption long_options
[] = {
1553 .longName
= "build-options",
1555 .argInfo
= POPT_ARG_NONE
,
1558 .descrip
= "Print build options" ,
1563 .argInfo
= POPT_ARG_STRING
,
1566 .descrip
= "Listen on the specified ports",
1569 .longName
= "profiling-level",
1571 .argInfo
= POPT_ARG_STRING
,
1572 .arg
= &profile_level
,
1574 .descrip
= "Set profiling level","PROFILE_LEVEL",
1581 struct smbd_parent_context
*parent
= NULL
;
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
,
1612 * Do this before any other talloc operation
1614 talloc_enable_null_tracking();
1615 frame
= talloc_stackframe();
1619 set_smbd_shim(&smbd_shim_fns
);
1621 smbd_init_globals();
1625 #ifdef HAVE_SET_AUTH_PARAMETERS
1626 set_auth_parameters(argc
,argv
);
1629 ok
= samba_cmdline_init(frame
,
1630 SAMBA_CMDLINE_CONFIG_SERVER
,
1631 true /* require_smbconf */);
1633 DBG_ERR("Failed to setup cmdline parser!\n");
1637 cmdline_daemon_cfg
= samba_cmdline_get_daemon_cfg();
1639 pc
= samba_popt_get_context(getprogname(),
1645 DBG_ERR("Failed to get popt context!\n");
1649 while((opt
= poptGetNextOpt(pc
)) != -1) {
1652 print_build_options
= True
;
1655 d_fprintf(stderr
, "\nInvalid option %s: %s\n\n",
1656 poptBadOption(pc
, 0), poptStrerror(opt
));
1657 poptPrintUsage(pc
, stderr
, 0);
1661 poptFreeContext(pc
);
1663 log_stdout
= (debug_get_log_type() == DEBUG_STDOUT
);
1665 if (cmdline_daemon_cfg
->interactive
) {
1669 if (print_build_options
) {
1670 build_options(True
); /* Display output to screen as well as debug */
1675 /* needed for SecureWare on SCO */
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"));
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 */
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
);
1709 /* we are never interested in SIGFPE */
1710 BlockSignals(True
,SIGFPE
);
1713 #if defined(SIGUSR2)
1714 /* We are no longer interested in USR2 */
1715 BlockSignals(True
,SIGUSR2
);
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. */
1732 /* we want total control over the permissions on created files,
1733 so set our umask to 0 */
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"));
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()) {
1763 /* Init the security context and global current_user */
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
) {
1777 * Init the messaging context
1778 * FIXME: This should only call messaging_init()
1780 msg_ctx
= global_messaging_context();
1781 if (msg_ctx
== NULL
) {
1785 dce_ctx
= global_dcesrv_context();
1786 if (dce_ctx
== NULL
) {
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)) {
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"));
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"));
1814 if (!profile_setup(msg_ctx
, False
)) {
1815 DEBUG(0,("ERROR: failed to setup profiling\n"));
1819 if (profile_level
!= NULL
) {
1820 profiling_level
= atoi(profile_level
);
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
,
1847 daemon_status("smbd", "Starting process ...");
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);
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
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
);
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
;
1898 se
= tevent_add_signal(parent
->ev_ctx
,
1901 smbd_parent_sig_term_handler
,
1904 exit_server("failed to setup SIGTERM handler");
1906 se
= tevent_add_signal(parent
->ev_ctx
,
1909 smbd_parent_sig_hup_handler
,
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
))
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(
1975 cmdline_daemon_cfg
->interactive
,
1976 &parent
->notifyd
)) {
1977 exit_daemon("Samba cannot init notification", EACCES
);
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
)) {
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
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
)));
2014 if (!init_guest_session_info(NULL
)) {
2015 DEBUG(0,("ERROR: failed to setup guest info.\n"));
2019 if (!file_init_global()) {
2020 DEBUG(0, ("ERROR: file_init_global() failed\n"));
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",
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
)));
2046 np_dir
= talloc_asprintf(talloc_tos(), "%s/np", lp_ncalrpc_dir());
2048 DEBUG(0, ("%s: Out of memory\n", __location__
));
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
)));
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
,
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
);
2106 } else if (serving_printers
) {
2107 ok
= printing_subsystem_init(ev_ctx
,
2117 if (!cmdline_daemon_cfg
->daemon
) {
2123 /* Started from inetd. fd 0 is the socket. */
2124 /* We will abort gracefully when the client or remote system
2128 /* close stdin, stdout (if not logging to it), but not stderr */
2129 ret
= close_low_fd(0);
2131 DBG_ERR("close_low_fd(0) failed: %s\n", strerror(ret
));
2134 if (!debug_get_output_is_stdout()) {
2135 ret
= close_low_fd(1);
2137 DBG_ERR("close_low_fd(1) failed: %s\n",
2148 smbd_setup_sig_chld_handler(parent
);
2150 smbd_process(ev_ctx
, msg_ctx
, dce_ctx
, sock
, true);
2152 exit_server_cleanly(NULL
);
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);
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.
2177 if (fstat(0, &st
) != 0) {
2180 if (S_ISFIFO(st
.st_mode
) || S_ISSOCK(st
.st_mode
)) {
2181 tevent_add_fd(ev_ctx
,
2190 smbd_parent_loop(ev_ctx
, parent
);
2192 exit_server_cleanly(NULL
);