2 Unix SMB/CIFS implementation.
3 Main SMB server routines
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Martin Pool 2002
6 Copyright (C) Jelmer Vernooij 2002-2003
7 Copyright (C) Volker Lendecke 1993-2007
8 Copyright (C) Jeremy Allison 1993-2007
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "system/filesys.h"
26 #include "popt_common.h"
27 #include "smbd/smbd.h"
28 #include "smbd/globals.h"
29 #include "registry/reg_init_full.h"
30 #include "libcli/auth/schannel.h"
32 #include "../lib/util/memcache.h"
33 #include "ctdbd_conn.h"
34 #include "util_cluster.h"
35 #include "printing/queue_process.h"
36 #include "rpc_server/rpc_service_setup.h"
37 #include "rpc_server/rpc_config.h"
42 #include "smbprofile.h"
43 #include "lib/id_cache.h"
44 #include "lib/param/param.h"
45 #include "lib/background.h"
46 #include "lib/conn_tdb.h"
47 #include "../lib/util/pidfile.h"
48 #include "lib/smbd_shim.h"
49 #include "scavenger.h"
50 #include "locking/leases_db.h"
52 struct smbd_open_socket
;
53 struct smbd_child_pid
;
55 struct smbd_parent_context
{
58 struct tevent_context
*ev_ctx
;
59 struct messaging_context
*msg_ctx
;
61 /* the list of listening sockets */
62 struct smbd_open_socket
*sockets
;
64 /* the list of current child processes */
65 struct smbd_child_pid
*children
;
68 struct tevent_timer
*cleanup_te
;
71 struct smbd_open_socket
{
72 struct smbd_open_socket
*prev
, *next
;
73 struct smbd_parent_context
*parent
;
75 struct tevent_fd
*fde
;
78 struct smbd_child_pid
{
79 struct smbd_child_pid
*prev
, *next
;
83 extern void start_epmd(struct tevent_context
*ev_ctx
,
84 struct messaging_context
*msg_ctx
);
86 extern void start_lsasd(struct tevent_context
*ev_ctx
,
87 struct messaging_context
*msg_ctx
);
89 extern void start_fssd(struct tevent_context
*ev_ctx
,
90 struct messaging_context
*msg_ctx
);
93 extern int dcelogin_atmost_once
;
96 /*******************************************************************
97 What to do when smb.conf is updated.
98 ********************************************************************/
100 static void smbd_parent_conf_updated(struct messaging_context
*msg
,
103 struct server_id server_id
,
106 struct tevent_context
*ev_ctx
=
107 talloc_get_type_abort(private_data
, struct tevent_context
);
109 DEBUG(10,("smbd_parent_conf_updated: Got message saying smb.conf was "
110 "updated. Reloading.\n"));
111 change_to_root_user();
112 reload_services(NULL
, NULL
, false);
113 printing_subsystem_update(ev_ctx
, msg
, false);
116 /*******************************************************************
117 Delete a statcache entry.
118 ********************************************************************/
120 static void smb_stat_cache_delete(struct messaging_context
*msg
,
123 struct server_id server_id
,
126 const char *name
= (const char *)data
->data
;
127 DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name
));
128 stat_cache_delete(name
);
131 /****************************************************************************
132 Send a SIGTERM to our process group.
133 *****************************************************************************/
135 static void killkids(void)
137 if(am_parent
) kill(0,SIGTERM
);
140 static void msg_exit_server(struct messaging_context
*msg
,
143 struct server_id server_id
,
146 DEBUG(3, ("got a SHUTDOWN message\n"));
147 exit_server_cleanly(NULL
);
151 static void msg_inject_fault(struct messaging_context
*msg
,
154 struct server_id src
,
158 struct server_id_buf tmp
;
160 if (data
->length
!= sizeof(sig
)) {
161 DEBUG(0, ("Process %s sent bogus signal injection request\n",
162 server_id_str_buf(src
, &tmp
)));
166 sig
= *(int *)data
->data
;
168 exit_server("internal error injected");
173 DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
174 server_id_str_buf(src
, &tmp
), sig
, strsignal(sig
)));
176 DEBUG(0, ("Process %s requested injection of signal %d\n",
177 server_id_str_buf(src
, &tmp
), sig
));
182 #endif /* DEVELOPER */
184 static NTSTATUS
messaging_send_to_children(struct messaging_context
*msg_ctx
,
185 uint32_t msg_type
, DATA_BLOB
* data
)
188 struct smbd_parent_context
*parent
= am_parent
;
189 struct smbd_child_pid
*child
;
191 if (parent
== NULL
) {
192 return NT_STATUS_INTERNAL_ERROR
;
195 for (child
= parent
->children
; child
!= NULL
; child
= child
->next
) {
196 status
= messaging_send(parent
->msg_ctx
,
197 pid_to_procid(child
->pid
),
199 if (!NT_STATUS_IS_OK(status
)) {
206 static void smb_parent_send_to_children(struct messaging_context
*ctx
,
209 struct server_id srv_id
,
212 messaging_send_to_children(ctx
, msg_type
, msg_data
);
216 * Parent smbd process sets its own debug level first and then
217 * sends a message to all the smbd children to adjust their debug
218 * level to that of the parent.
221 static void smbd_msg_debug(struct messaging_context
*msg_ctx
,
224 struct server_id server_id
,
227 debug_message(msg_ctx
, private_data
, MSG_DEBUG
, server_id
, data
);
229 messaging_send_to_children(msg_ctx
, MSG_DEBUG
, data
);
232 static void smbd_parent_id_cache_kill(struct messaging_context
*msg_ctx
,
235 struct server_id server_id
,
238 const char *msg
= (data
&& data
->data
)
239 ? (const char *)data
->data
: "<NULL>";
240 struct id_cache_ref id
;
242 if (!id_cache_ref_parse(msg
, &id
)) {
243 DEBUG(0, ("Invalid ?ID: %s\n", msg
));
247 id_cache_delete_from_cache(&id
);
249 messaging_send_to_children(msg_ctx
, msg_type
, data
);
252 static void smbd_parent_id_cache_delete(struct messaging_context
*ctx
,
255 struct server_id srv_id
,
258 id_cache_delete_message(ctx
, data
, msg_type
, srv_id
, msg_data
);
260 messaging_send_to_children(ctx
, msg_type
, msg_data
);
263 struct smbd_parent_notify_state
{
264 struct tevent_context
*ev
;
265 struct messaging_context
*msg
;
267 struct notify_context
*notify
;
270 static int smbd_parent_notify_cleanup(void *private_data
);
271 static void smbd_parent_notify_cleanup_done(struct tevent_req
*req
);
272 static void smbd_parent_notify_proxy_done(struct tevent_req
*req
);
274 static bool smbd_parent_notify_init(TALLOC_CTX
*mem_ctx
,
275 struct messaging_context
*msg
,
276 struct tevent_context
*ev
)
278 struct smbd_parent_notify_state
*state
;
279 struct tevent_req
*req
;
281 state
= talloc(mem_ctx
, struct smbd_parent_notify_state
);
287 state
->msgtype
= MSG_SMB_NOTIFY_CLEANUP
;
289 state
->notify
= notify_init(state
, msg
, ev
);
290 if (state
->notify
== NULL
) {
293 req
= background_job_send(
294 state
, state
->ev
, state
->msg
, &state
->msgtype
, 1,
295 lp_parm_int(-1, "smbd", "notify cleanup interval", 60),
296 smbd_parent_notify_cleanup
, state
->notify
);
300 tevent_req_set_callback(req
, smbd_parent_notify_cleanup_done
, state
);
302 if (!lp_clustering()) {
306 req
= notify_cluster_proxy_send(state
, ev
, state
->notify
);
310 tevent_req_set_callback(req
, smbd_parent_notify_proxy_done
, state
);
318 static int smbd_parent_notify_cleanup(void *private_data
)
320 struct notify_context
*notify
= talloc_get_type_abort(
321 private_data
, struct notify_context
);
322 notify_cleanup(notify
);
323 return lp_parm_int(-1, "smbd", "notify cleanup interval", 60);
326 static void smbd_parent_notify_cleanup_done(struct tevent_req
*req
)
328 struct smbd_parent_notify_state
*state
= tevent_req_callback_data(
329 req
, struct smbd_parent_notify_state
);
332 status
= background_job_recv(req
);
334 DEBUG(1, ("notify cleanup job ended with %s\n", nt_errstr(status
)));
337 * Provide self-healing: Whatever the error condition was, it
338 * will have printed it into log.smbd. Just retrying and
339 * spamming log.smbd once a minute should be fine.
341 req
= background_job_send(
342 state
, state
->ev
, state
->msg
, &state
->msgtype
, 1, 60,
343 smbd_parent_notify_cleanup
, state
->notify
);
345 DEBUG(1, ("background_job_send failed\n"));
348 tevent_req_set_callback(req
, smbd_parent_notify_cleanup_done
, state
);
351 static void smbd_parent_notify_proxy_done(struct tevent_req
*req
)
355 ret
= notify_cluster_proxy_recv(req
);
357 DEBUG(1, ("notify proxy job ended with %s\n", strerror(ret
)));
360 static void add_child_pid(struct smbd_parent_context
*parent
,
363 struct smbd_child_pid
*child
;
365 child
= talloc_zero(parent
, struct smbd_child_pid
);
367 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
371 DLIST_ADD(parent
->children
, child
);
372 parent
->num_children
+= 1;
375 static void smb_tell_num_children(struct messaging_context
*ctx
, void *data
,
376 uint32_t msg_type
, struct server_id srv_id
,
379 uint8_t buf
[sizeof(uint32_t)];
382 SIVAL(buf
, 0, am_parent
->num_children
);
383 messaging_send_buf(ctx
, srv_id
, MSG_SMB_NUM_CHILDREN
,
390 at most every smbd:cleanuptime seconds (default 20), we scan the BRL
391 and locking database for entries to cleanup. As a side effect this
392 also cleans up dead entries in the connections database (due to the
393 traversal in message_send_all()
395 Using a timer for this prevents a flood of traversals when a large
396 number of clients disconnect at the same time (perhaps due to a
400 static void cleanup_timeout_fn(struct tevent_context
*event_ctx
,
401 struct tevent_timer
*te
,
405 struct smbd_parent_context
*parent
=
406 talloc_get_type_abort(private_data
,
407 struct smbd_parent_context
);
409 parent
->cleanup_te
= NULL
;
411 DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
412 message_send_all(parent
->msg_ctx
, MSG_SMB_UNLOCK
, NULL
, 0, NULL
);
413 messaging_send_buf(parent
->msg_ctx
,
414 messaging_server_id(parent
->msg_ctx
),
415 MSG_SMB_BRL_VALIDATE
, NULL
, 0);
418 static void remove_child_pid(struct smbd_parent_context
*parent
,
420 bool unclean_shutdown
)
422 struct smbd_child_pid
*child
;
423 struct server_id child_id
;
426 child_id
= pid_to_procid(pid
);
428 ret
= messaging_cleanup(parent
->msg_ctx
, pid
);
430 if ((ret
!= 0) && (ret
!= ENOENT
)) {
431 DEBUG(10, ("%s: messaging_cleanup returned %s\n",
432 __func__
, strerror(ret
)));
435 smbprofile_cleanup(pid
);
437 for (child
= parent
->children
; child
!= NULL
; child
= child
->next
) {
438 if (child
->pid
== pid
) {
439 struct smbd_child_pid
*tmp
= child
;
440 DLIST_REMOVE(parent
->children
, child
);
442 parent
->num_children
-= 1;
448 /* not all forked child processes are added to the children list */
449 DEBUG(2, ("Could not find child %d -- ignoring\n", (int)pid
));
453 if (unclean_shutdown
) {
454 /* a child terminated uncleanly so tickle all
455 processes to see if they can grab any of the
458 DEBUG(3,(__location__
" Unclean shutdown of pid %u\n",
460 if (parent
->cleanup_te
== NULL
) {
461 /* call the cleanup timer, but not too often */
462 int cleanup_time
= lp_parm_int(-1, "smbd", "cleanuptime", 20);
463 parent
->cleanup_te
= tevent_add_timer(parent
->ev_ctx
,
465 timeval_current_ofs(cleanup_time
, 0),
468 DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
472 if (!serverid_deregister(child_id
)) {
473 DEBUG(1, ("Could not remove pid %d from serverid.tdb\n",
478 /****************************************************************************
479 Have we reached the process limit ?
480 ****************************************************************************/
482 static bool allowable_number_of_smbd_processes(struct smbd_parent_context
*parent
)
484 int max_processes
= lp_max_smbd_processes();
489 return parent
->num_children
< max_processes
;
492 static void smbd_sig_chld_handler(struct tevent_context
*ev
,
493 struct tevent_signal
*se
,
501 struct smbd_parent_context
*parent
=
502 talloc_get_type_abort(private_data
,
503 struct smbd_parent_context
);
505 while ((pid
= sys_waitpid(-1, &status
, WNOHANG
)) > 0) {
506 bool unclean_shutdown
= False
;
508 /* If the child terminated normally, assume
509 it was an unclean shutdown unless the
512 if (WIFEXITED(status
)) {
513 unclean_shutdown
= WEXITSTATUS(status
);
515 /* If the child terminated due to a signal
516 we always assume it was unclean.
518 if (WIFSIGNALED(status
)) {
519 unclean_shutdown
= True
;
521 remove_child_pid(parent
, pid
, unclean_shutdown
);
525 static void smbd_setup_sig_chld_handler(struct smbd_parent_context
*parent
)
527 struct tevent_signal
*se
;
529 se
= tevent_add_signal(parent
->ev_ctx
,
530 parent
, /* mem_ctx */
532 smbd_sig_chld_handler
,
535 exit_server("failed to setup SIGCHLD handler");
539 static void smbd_open_socket_close_fn(struct tevent_context
*ev
,
540 struct tevent_fd
*fde
,
544 /* this might be the socket_wrapper swrap_close() */
548 static void smbd_accept_connection(struct tevent_context
*ev
,
549 struct tevent_fd
*fde
,
553 struct smbd_open_socket
*s
= talloc_get_type_abort(private_data
,
554 struct smbd_open_socket
);
555 struct messaging_context
*msg_ctx
= s
->parent
->msg_ctx
;
556 struct sockaddr_storage addr
;
557 socklen_t in_addrlen
= sizeof(addr
);
562 fd
= accept(s
->fd
, (struct sockaddr
*)(void *)&addr
,&in_addrlen
);
563 if (fd
== -1 && errno
== EINTR
)
567 DEBUG(0,("accept: %s\n",
572 if (s
->parent
->interactive
) {
573 reinit_after_fork(msg_ctx
, ev
, true);
574 smbd_process(ev
, msg_ctx
, fd
, true);
575 exit_server_cleanly("end of interactive mode");
579 if (!allowable_number_of_smbd_processes(s
->parent
)) {
585 * Generate a unique id in the parent process so that we use
586 * the global random state in the parent.
588 unique_id
= serverid_get_random_unique_id();
592 NTSTATUS status
= NT_STATUS_OK
;
595 * Can't use TALLOC_FREE here. Nulling out the argument to it
596 * would overwrite memory we've just freed.
598 talloc_free(s
->parent
);
601 set_my_unique_id(unique_id
);
603 /* Stop zombies, the parent explicitly handles
604 * them, counting worker smbds. */
607 status
= smbd_reinit_after_fork(msg_ctx
, ev
, true);
608 if (!NT_STATUS_IS_OK(status
)) {
609 if (NT_STATUS_EQUAL(status
,
610 NT_STATUS_TOO_MANY_OPENED_FILES
)) {
611 DEBUG(0,("child process cannot initialize "
612 "because too many files are open\n"));
615 if (lp_clustering() &&
616 NT_STATUS_EQUAL(status
,
617 NT_STATUS_INTERNAL_DB_ERROR
)) {
618 DEBUG(1,("child process cannot initialize "
619 "because connection to CTDB "
624 DEBUG(0,("reinit_after_fork() failed\n"));
625 smb_panic("reinit_after_fork() failed");
628 smbd_process(ev
, msg_ctx
, fd
, false);
630 exit_server_cleanly("end of child");
635 DEBUG(0,("smbd_accept_connection: fork() failed: %s\n",
639 /* The parent doesn't need this socket */
642 /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
643 Clear the closed fd info out of server_fd --
644 and more importantly, out of client_fd in
645 util_sock.c, to avoid a possible
646 getpeername failure if we reopen the logs
647 and use %I in the filename.
651 add_child_pid(s
->parent
, pid
);
654 /* Force parent to check log size after
655 * spawning child. Fix from
656 * klausr@ITAP.Physik.Uni-Stuttgart.De. The
657 * parent smbd will log to logserver.smb. It
658 * writes only two messages for each child
659 * started/finished. But each child writes,
660 * say, 50 messages also in logserver.smb,
661 * begining with the debug_count of the
662 * parent, before the child opens its own log
663 * file logserver.client. In a worst case
664 * scenario the size of logserver.smb would be
665 * checked after about 50*50=2500 messages
668 force_check_log_size();
671 static bool smbd_open_one_socket(struct smbd_parent_context
*parent
,
672 struct tevent_context
*ev_ctx
,
673 const struct sockaddr_storage
*ifss
,
676 struct smbd_open_socket
*s
;
678 s
= talloc(parent
, struct smbd_open_socket
);
684 s
->fd
= open_socket_in(SOCK_STREAM
,
686 parent
->sockets
== NULL
? 0 : 2,
690 DEBUG(0,("smbd_open_once_socket: open_socket_in: "
691 "%s\n", strerror(errno
)));
694 * We ignore an error here, as we've done before
699 /* ready to listen */
700 set_socket_options(s
->fd
, "SO_KEEPALIVE");
701 set_socket_options(s
->fd
, lp_socket_options());
703 /* Set server socket to
704 * non-blocking for the accept. */
705 set_blocking(s
->fd
, False
);
707 if (listen(s
->fd
, SMBD_LISTEN_BACKLOG
) == -1) {
708 DEBUG(0,("open_sockets_smbd: listen: "
709 "%s\n", strerror(errno
)));
715 s
->fde
= tevent_add_fd(ev_ctx
,
717 s
->fd
, TEVENT_FD_READ
,
718 smbd_accept_connection
,
721 DEBUG(0,("open_sockets_smbd: "
722 "tevent_add_fd: %s\n",
728 tevent_fd_set_close_fn(s
->fde
, smbd_open_socket_close_fn
);
730 DLIST_ADD_END(parent
->sockets
, s
, struct smbd_open_socket
*);
735 /****************************************************************************
736 Open the socket communication.
737 ****************************************************************************/
739 static bool open_sockets_smbd(struct smbd_parent_context
*parent
,
740 struct tevent_context
*ev_ctx
,
741 struct messaging_context
*msg_ctx
,
742 const char *smb_ports
)
744 int num_interfaces
= iface_count();
747 unsigned dns_port
= 0;
754 smbd_setup_sig_chld_handler(parent
);
756 ports
= lp_smb_ports();
758 /* use a reasonable default set of ports - listing on 445 and 139 */
761 l
= str_list_make_v3(talloc_tos(), smb_ports
, NULL
);
762 ports
= discard_const_p(const char *, l
);
765 for (j
= 0; ports
&& ports
[j
]; j
++) {
766 unsigned port
= atoi(ports
[j
]);
768 if (port
== 0 || port
> 0xffff) {
769 exit_server_cleanly("Invalid port in the config or on "
770 "the commandline specified!");
774 if (lp_interfaces() && lp_bind_interfaces_only()) {
775 /* We have been given an interfaces line, and been
776 told to only bind to those interfaces. Create a
777 socket per interface and bind to only these.
780 /* Now open a listen socket for each of the
782 for(i
= 0; i
< num_interfaces
; i
++) {
783 const struct sockaddr_storage
*ifss
=
784 iface_n_sockaddr_storage(i
);
786 DEBUG(0,("open_sockets_smbd: "
787 "interface %d has NULL IP address !\n",
792 for (j
= 0; ports
&& ports
[j
]; j
++) {
793 unsigned port
= atoi(ports
[j
]);
795 /* Keep the first port for mDNS service
802 if (!smbd_open_one_socket(parent
,
811 /* Just bind to 0.0.0.0 - accept connections
814 const char *sock_addr
;
816 const char *sock_ptr
;
819 sock_addr
= "::,0.0.0.0";
821 sock_addr
= "0.0.0.0";
824 for (sock_ptr
=sock_addr
;
825 next_token_talloc(talloc_tos(), &sock_ptr
, &sock_tok
, " \t,"); ) {
826 for (j
= 0; ports
&& ports
[j
]; j
++) {
827 struct sockaddr_storage ss
;
828 unsigned port
= atoi(ports
[j
]);
830 /* Keep the first port for mDNS service
837 /* open an incoming socket */
838 if (!interpret_string_addr(&ss
, sock_tok
,
839 AI_NUMERICHOST
|AI_PASSIVE
)) {
844 * If we fail to open any sockets
845 * in this loop the parent-sockets == NULL
846 * case below will prevent us from starting.
849 (void)smbd_open_one_socket(parent
,
857 if (parent
->sockets
== NULL
) {
858 DEBUG(0,("open_sockets_smbd: No "
859 "sockets available to bind to.\n"));
863 /* Setup the main smbd so that we can get messages. Note that
864 do this after starting listening. This is needed as when in
865 clustered mode, ctdb won't allow us to start doing database
866 operations until it has gone thru a full startup, which
867 includes checking to see that smbd is listening. */
869 if (!serverid_register(messaging_server_id(msg_ctx
),
870 FLAG_MSG_GENERAL
|FLAG_MSG_SMBD
871 |FLAG_MSG_PRINT_GENERAL
873 DEBUG(0, ("open_sockets_smbd: Failed to register "
874 "myself in serverid.tdb\n"));
878 /* Listen to messages */
880 messaging_register(msg_ctx
, NULL
, MSG_SHUTDOWN
, msg_exit_server
);
881 messaging_register(msg_ctx
, ev_ctx
, MSG_SMB_CONF_UPDATED
,
882 smbd_parent_conf_updated
);
883 messaging_register(msg_ctx
, NULL
, MSG_SMB_STAT_CACHE_DELETE
,
884 smb_stat_cache_delete
);
885 messaging_register(msg_ctx
, NULL
, MSG_DEBUG
, smbd_msg_debug
);
886 messaging_register(msg_ctx
, NULL
, MSG_SMB_BRL_VALIDATE
,
888 messaging_register(msg_ctx
, NULL
, MSG_SMB_FORCE_TDIS
,
889 smb_parent_send_to_children
);
890 messaging_register(msg_ctx
, NULL
, MSG_SMB_KILL_CLIENT_IP
,
891 smb_parent_send_to_children
);
892 messaging_register(msg_ctx
, NULL
, MSG_SMB_TELL_NUM_CHILDREN
,
893 smb_tell_num_children
);
895 messaging_register(msg_ctx
, NULL
,
896 ID_CACHE_DELETE
, smbd_parent_id_cache_delete
);
897 messaging_register(msg_ctx
, NULL
,
898 ID_CACHE_KILL
, smbd_parent_id_cache_kill
);
900 if (lp_clustering()) {
901 ctdbd_register_reconfigure(messaging_ctdbd_connection());
905 messaging_register(msg_ctx
, NULL
, MSG_SMB_INJECT_FAULT
,
909 if (lp_multicast_dns_register() && (dns_port
!= 0)) {
910 #ifdef WITH_DNSSD_SUPPORT
911 smbd_setup_mdns_registration(ev_ctx
,
914 #ifdef WITH_AVAHI_SUPPORT
917 avahi_conn
= avahi_start_register(ev_ctx
,
920 if (avahi_conn
== NULL
) {
921 DEBUG(10, ("avahi_start_register failed\n"));
931 handle stdin becoming readable when we are in --foreground mode
933 static void smbd_stdin_handler(struct tevent_context
*ev
,
934 struct tevent_fd
*fde
,
939 if (read(0, &c
, 1) != 1) {
940 /* we have reached EOF on stdin, which means the
941 parent has exited. Shutdown the server */
942 exit_server_cleanly("EOF on stdin");
946 struct smbd_parent_tevent_trace_state
{
950 static void smbd_parent_tevent_trace_callback(enum tevent_trace_point point
,
953 struct smbd_parent_tevent_trace_state
*state
=
954 (struct smbd_parent_tevent_trace_state
*)private_data
;
957 case TEVENT_TRACE_BEFORE_WAIT
:
959 case TEVENT_TRACE_AFTER_WAIT
:
961 case TEVENT_TRACE_BEFORE_LOOP_ONCE
:
962 TALLOC_FREE(state
->frame
);
963 state
->frame
= talloc_stackframe();
965 case TEVENT_TRACE_AFTER_LOOP_ONCE
:
966 TALLOC_FREE(state
->frame
);
973 static void smbd_parent_loop(struct tevent_context
*ev_ctx
,
974 struct smbd_parent_context
*parent
)
976 struct smbd_parent_tevent_trace_state trace_state
= {
981 tevent_set_trace_callback(ev_ctx
, smbd_parent_tevent_trace_callback
,
984 /* now accept incoming connections - forking a new process
985 for each incoming connection */
986 DEBUG(2,("waiting for connections\n"));
988 ret
= tevent_loop_wait(ev_ctx
);
990 DEBUG(0, ("tevent_loop_wait failed: %d, %s, exiting\n",
991 ret
, strerror(errno
)));
994 TALLOC_FREE(trace_state
.frame
);
996 /* NOTREACHED return True; */
1000 /****************************************************************************
1001 Initialise connect, service and file structs.
1002 ****************************************************************************/
1004 static bool init_structs(void )
1007 * Set the machine NETBIOS name if not already
1008 * set from the config file.
1014 if (!secrets_init())
1020 static void smbd_parent_sig_term_handler(struct tevent_context
*ev
,
1021 struct tevent_signal
*se
,
1027 exit_server_cleanly("termination signal");
1030 static void smbd_parent_sig_hup_handler(struct tevent_context
*ev
,
1031 struct tevent_signal
*se
,
1037 struct smbd_parent_context
*parent
=
1038 talloc_get_type_abort(private_data
,
1039 struct smbd_parent_context
);
1041 change_to_root_user();
1042 DEBUG(1,("parent: Reloading services after SIGHUP\n"));
1043 reload_services(NULL
, NULL
, false);
1045 printing_subsystem_update(parent
->ev_ctx
, parent
->msg_ctx
, true);
1048 /****************************************************************************
1050 ****************************************************************************/
1052 /* Declare prototype for build_options() to avoid having to run it through
1053 mkproto.h. Mixing $(builddir) and $(srcdir) source files in the current
1054 prototype generation system is too complicated. */
1056 extern void build_options(bool screen
);
1058 int main(int argc
,const char *argv
[])
1060 /* shall I run as a daemon */
1061 bool is_daemon
= false;
1062 bool interactive
= false;
1064 bool no_process_group
= false;
1065 bool log_stdout
= false;
1067 char *profile_level
= NULL
;
1070 bool print_build_options
= False
;
1075 OPT_NO_PROCESS_GROUP
,
1078 struct poptOption long_options
[] = {
1080 {"daemon", 'D', POPT_ARG_NONE
, NULL
, OPT_DAEMON
, "Become a daemon (default)" },
1081 {"interactive", 'i', POPT_ARG_NONE
, NULL
, OPT_INTERACTIVE
, "Run interactive (not a daemon)"},
1082 {"foreground", 'F', POPT_ARG_NONE
, NULL
, OPT_FORK
, "Run daemon in foreground (for daemontools, etc.)" },
1083 {"no-process-group", '\0', POPT_ARG_NONE
, NULL
, OPT_NO_PROCESS_GROUP
, "Don't create a new process group" },
1084 {"log-stdout", 'S', POPT_ARG_NONE
, NULL
, OPT_LOG_STDOUT
, "Log to stdout" },
1085 {"build-options", 'b', POPT_ARG_NONE
, NULL
, 'b', "Print build options" },
1086 {"port", 'p', POPT_ARG_STRING
, &ports
, 0, "Listen on the specified ports"},
1087 {"profiling-level", 'P', POPT_ARG_STRING
, &profile_level
, 0, "Set profiling level","PROFILE_LEVEL"},
1091 struct smbd_parent_context
*parent
= NULL
;
1094 struct tevent_context
*ev_ctx
;
1095 struct messaging_context
*msg_ctx
;
1096 struct server_id server_id
;
1097 struct tevent_signal
*se
;
1098 int profiling_level
;
1099 char *np_dir
= NULL
;
1100 static const struct smbd_shim smbd_shim_fns
=
1102 .cancel_pending_lock_requests_by_fid
= smbd_cancel_pending_lock_requests_by_fid
,
1103 .send_stat_cache_delete_message
= smbd_send_stat_cache_delete_message
,
1104 .change_to_root_user
= smbd_change_to_root_user
,
1105 .become_authenticated_pipe_user
= smbd_become_authenticated_pipe_user
,
1106 .unbecome_authenticated_pipe_user
= smbd_unbecome_authenticated_pipe_user
,
1108 .contend_level2_oplocks_begin
= smbd_contend_level2_oplocks_begin
,
1109 .contend_level2_oplocks_end
= smbd_contend_level2_oplocks_end
,
1111 .become_root
= smbd_become_root
,
1112 .unbecome_root
= smbd_unbecome_root
,
1114 .exit_server
= smbd_exit_server
,
1115 .exit_server_cleanly
= smbd_exit_server_cleanly
,
1119 * Do this before any other talloc operation
1121 talloc_enable_null_tracking();
1122 frame
= talloc_stackframe();
1124 setup_logging(argv
[0], DEBUG_DEFAULT_STDOUT
);
1128 set_smbd_shim(&smbd_shim_fns
);
1130 smbd_init_globals();
1134 #ifdef HAVE_SET_AUTH_PARAMETERS
1135 set_auth_parameters(argc
,argv
);
1138 pc
= poptGetContext("smbd", argc
, argv
, long_options
, 0);
1139 while((opt
= poptGetNextOpt(pc
)) != -1) {
1144 case OPT_INTERACTIVE
:
1150 case OPT_NO_PROCESS_GROUP
:
1151 no_process_group
= true;
1153 case OPT_LOG_STDOUT
:
1157 print_build_options
= True
;
1160 d_fprintf(stderr
, "\nInvalid option %s: %s\n\n",
1161 poptBadOption(pc
, 0), poptStrerror(opt
));
1162 poptPrintUsage(pc
, stderr
, 0);
1166 poptFreeContext(pc
);
1174 setup_logging(argv
[0], DEBUG_STDOUT
);
1176 setup_logging(argv
[0], DEBUG_FILE
);
1179 if (print_build_options
) {
1180 build_options(True
); /* Display output to screen as well as debug */
1185 /* needed for SecureWare on SCO */
1189 set_remote_machine_name("smbd", False
);
1191 if (interactive
&& (DEBUGLEVEL
>= 9)) {
1192 talloc_enable_leak_report();
1195 if (log_stdout
&& Fork
) {
1196 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
1200 /* we want to re-seed early to prevent time delays causing
1201 client problems at a later date. (tridge) */
1202 generate_random_buffer(NULL
, 0);
1204 /* get initial effective uid and gid */
1207 /* make absolutely sure we run as root - to handle cases where people
1208 are crazy enough to have it setuid */
1209 gain_root_privilege();
1210 gain_root_group_privilege();
1213 dump_core_setup("smbd", lp_logfile(talloc_tos()));
1215 /* we are never interested in SIGPIPE */
1216 BlockSignals(True
,SIGPIPE
);
1219 /* we are never interested in SIGFPE */
1220 BlockSignals(True
,SIGFPE
);
1223 #if defined(SIGUSR2)
1224 /* We are no longer interested in USR2 */
1225 BlockSignals(True
,SIGUSR2
);
1228 /* POSIX demands that signals are inherited. If the invoking process has
1229 * these signals masked, we will have problems, as we won't recieve them. */
1230 BlockSignals(False
, SIGHUP
);
1231 BlockSignals(False
, SIGUSR1
);
1232 BlockSignals(False
, SIGTERM
);
1234 /* Ensure we leave no zombies until we
1235 * correctly set up child handling below. */
1239 /* we want total control over the permissions on created files,
1240 so set our umask to 0 */
1245 DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1246 DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE
));
1248 DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1249 (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1251 /* Output the build options to the debug log */
1252 build_options(False
);
1254 if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4) {
1255 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1259 if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1260 DEBUG(0, ("error opening config file '%s'\n", get_dyn_CONFIGFILE()));
1264 if (!cluster_probe_ok()) {
1268 /* Init the security context and global current_user */
1272 * Initialize the event context. The event context needs to be
1273 * initialized before the messaging context, cause the messaging
1274 * context holds an event context.
1275 * FIXME: This should be s3_tevent_context_init()
1277 ev_ctx
= server_event_context();
1278 if (ev_ctx
== NULL
) {
1283 * Init the messaging context
1284 * FIXME: This should only call messaging_init()
1286 msg_ctx
= server_messaging_context();
1287 if (msg_ctx
== NULL
) {
1292 * Reloading of the printers will not work here as we don't have a
1293 * server info and rpc services set up. It will be called later.
1295 if (!reload_services(NULL
, NULL
, false)) {
1299 if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC
1300 && !lp_parm_bool(-1, "server role check", "inhibit", false)) {
1301 DEBUG(0, ("server role = 'active directory domain controller' not compatible with running smbd standalone. \n"));
1302 DEBUGADD(0, ("You should start 'samba' instead, and it will control starting smbd if required\n"));
1306 /* ...NOTE... Log files are working from this point! */
1308 DEBUG(3,("loaded services\n"));
1312 if (!profile_setup(msg_ctx
, False
)) {
1313 DEBUG(0,("ERROR: failed to setup profiling\n"));
1317 if (profile_level
!= NULL
) {
1318 profiling_level
= atoi(profile_level
);
1320 profiling_level
= lp_smbd_profiling_level();
1322 set_profile_level(profiling_level
, messaging_server_id(msg_ctx
));
1324 if (!is_daemon
&& !is_a_socket(0)) {
1326 DEBUG(3, ("Standard input is not a socket, "
1327 "assuming -D option\n"));
1331 * Setting is_daemon here prevents us from eventually calling
1332 * the open_sockets_inetd()
1338 if (is_daemon
&& !interactive
) {
1339 DEBUG(3, ("Becoming a daemon.\n"));
1340 become_daemon(Fork
, no_process_group
, log_stdout
);
1343 set_my_unique_id(serverid_get_random_unique_id());
1347 * If we're interactive we want to set our own process group for
1348 * signal management.
1350 if (interactive
&& !no_process_group
)
1351 setpgid( (pid_t
)0, (pid_t
)0);
1354 if (!directory_exist(lp_lock_directory()))
1355 mkdir(lp_lock_directory(), 0755);
1357 if (!directory_exist(lp_pid_directory()))
1358 mkdir(lp_pid_directory(), 0755);
1361 pidfile_create(lp_pid_directory(), "smbd");
1363 status
= reinit_after_fork(msg_ctx
,
1366 if (!NT_STATUS_IS_OK(status
)) {
1367 exit_daemon("reinit_after_fork() failed", map_errno_from_nt_status(status
));
1372 * Do not initialize the parent-child-pipe before becoming a
1373 * daemon: this is used to detect a died parent in the child
1376 status
= init_before_fork();
1377 if (!NT_STATUS_IS_OK(status
)) {
1378 exit_daemon(nt_errstr(status
), map_errno_from_nt_status(status
));
1382 parent
= talloc_zero(ev_ctx
, struct smbd_parent_context
);
1384 exit_server("talloc(struct smbd_parent_context) failed");
1386 parent
->interactive
= interactive
;
1387 parent
->ev_ctx
= ev_ctx
;
1388 parent
->msg_ctx
= msg_ctx
;
1391 se
= tevent_add_signal(parent
->ev_ctx
,
1394 smbd_parent_sig_term_handler
,
1397 exit_server("failed to setup SIGTERM handler");
1399 se
= tevent_add_signal(parent
->ev_ctx
,
1402 smbd_parent_sig_hup_handler
,
1405 exit_server("failed to setup SIGHUP handler");
1408 /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1410 if (smbd_memcache() == NULL
) {
1411 exit_daemon("no memcache available", EACCES
);
1414 memcache_set_global(smbd_memcache());
1416 /* Initialise the password backed before the global_sam_sid
1417 to ensure that we fetch from ldap before we make a domain sid up */
1419 if(!initialize_password_db(false, ev_ctx
))
1422 if (!secrets_init()) {
1423 exit_daemon("smbd can not open secrets.tdb", EACCES
);
1426 if (lp_server_role() == ROLE_DOMAIN_BDC
|| lp_server_role() == ROLE_DOMAIN_PDC
) {
1427 struct loadparm_context
*lp_ctx
= loadparm_init_s3(NULL
, loadparm_s3_helpers());
1428 if (!open_schannel_session_store(NULL
, lp_ctx
)) {
1429 exit_daemon("ERROR: Samba cannot open schannel store for secured NETLOGON operations.", EACCES
);
1431 TALLOC_FREE(lp_ctx
);
1434 if(!get_global_sam_sid()) {
1435 exit_daemon("Samba cannot create a SAM SID", EACCES
);
1438 server_id
= messaging_server_id(msg_ctx
);
1439 status
= smbXsrv_version_global_init(&server_id
);
1440 if (!NT_STATUS_IS_OK(status
)) {
1441 exit_daemon("Samba cannot init server context", EACCES
);
1444 status
= smbXsrv_session_global_init();
1445 if (!NT_STATUS_IS_OK(status
)) {
1446 exit_daemon("Samba cannot init session context", EACCES
);
1449 status
= smbXsrv_tcon_global_init();
1450 if (!NT_STATUS_IS_OK(status
)) {
1451 exit_daemon("Samba cannot init tcon context", EACCES
);
1454 if (!locking_init())
1455 exit_daemon("Samba cannot init locking", EACCES
);
1457 if (!leases_db_init(false)) {
1458 exit_daemon("Samba cannot init leases", EACCES
);
1461 if (!smbd_parent_notify_init(NULL
, msg_ctx
, ev_ctx
)) {
1462 exit_daemon("Samba cannot init notification", EACCES
);
1465 if (!messaging_parent_dgm_cleanup_init(msg_ctx
)) {
1469 if (!smbd_scavenger_init(NULL
, msg_ctx
, ev_ctx
)) {
1470 exit_daemon("Samba cannot init scavenging", EACCES
);
1473 if (!serverid_parent_init(ev_ctx
)) {
1474 exit_daemon("Samba cannot init server id", EACCES
);
1477 if (!W_ERROR_IS_OK(registry_init_full()))
1478 exit_daemon("Samba cannot init registry", EACCES
);
1480 /* Open the share_info.tdb here, so we don't have to open
1481 after the fork on every single connection. This is a small
1482 performance improvment and reduces the total number of system
1484 if (!share_info_db_init()) {
1485 exit_daemon("ERROR: failed to load share info db.", EACCES
);
1488 status
= init_system_session_info();
1489 if (!NT_STATUS_IS_OK(status
)) {
1490 DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
1491 nt_errstr(status
)));
1495 if (!init_guest_info()) {
1496 DEBUG(0,("ERROR: failed to setup guest info.\n"));
1500 if (!file_init_global()) {
1501 DEBUG(0, ("ERROR: file_init_global() failed\n"));
1504 status
= smbXsrv_open_global_init();
1505 if (!NT_STATUS_IS_OK(status
)) {
1506 exit_daemon("Samba cannot init global open", map_errno_from_nt_status(status
));
1509 /* This MUST be done before start_epmd() because otherwise
1510 * start_epmd() forks and races against dcesrv_ep_setup() to
1511 * call directory_create_or_exist() */
1512 if (!directory_create_or_exist(lp_ncalrpc_dir(), 0755)) {
1513 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
1514 lp_ncalrpc_dir(), strerror(errno
)));
1518 np_dir
= talloc_asprintf(talloc_tos(), "%s/np", lp_ncalrpc_dir());
1520 DEBUG(0, ("%s: Out of memory\n", __location__
));
1524 if (!directory_create_or_exist_strict(np_dir
, geteuid(), 0700)) {
1525 DEBUG(0, ("Failed to create pipe directory %s - %s\n",
1526 np_dir
, strerror(errno
)));
1530 if (is_daemon
&& !interactive
) {
1531 if (rpc_epmapper_daemon() == RPC_DAEMON_FORK
) {
1532 start_epmd(ev_ctx
, msg_ctx
);
1536 if (!dcesrv_ep_setup(ev_ctx
, msg_ctx
)) {
1537 exit_daemon("Samba cannot setup ep pipe", EACCES
);
1540 if (is_daemon
&& !interactive
) {
1541 daemon_ready("smbd");
1544 /* only start other daemons if we are running as a daemon
1545 * -- bad things will happen if smbd is launched via inetd
1546 * and we fork a copy of ourselves here */
1547 if (is_daemon
&& !interactive
) {
1549 if (rpc_lsasd_daemon() == RPC_DAEMON_FORK
) {
1550 start_lsasd(ev_ctx
, msg_ctx
);
1553 if (rpc_fss_daemon() == RPC_DAEMON_FORK
) {
1554 start_fssd(ev_ctx
, msg_ctx
);
1557 if (!lp__disable_spoolss() &&
1558 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED
)) {
1559 bool bgq
= lp_parm_bool(-1, "smbd", "backgroundqueue", true);
1561 if (!printing_subsystem_init(ev_ctx
, msg_ctx
, true, bgq
)) {
1562 exit_daemon("Samba failed to init printing subsystem", EACCES
);
1565 } else if (!lp__disable_spoolss() &&
1566 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED
)) {
1567 if (!printing_subsystem_init(ev_ctx
, msg_ctx
, false, false)) {
1578 /* Started from inetd. fd 0 is the socket. */
1579 /* We will abort gracefully when the client or remote system
1583 /* close stdin, stdout (if not logging to it), but not stderr */
1584 close_low_fds(true, !debug_get_output_is_stdout(), false);
1591 smbd_setup_sig_chld_handler(parent
);
1593 smbd_process(ev_ctx
, msg_ctx
, sock
, true);
1595 exit_server_cleanly(NULL
);
1599 if (!open_sockets_smbd(parent
, ev_ctx
, msg_ctx
, ports
))
1600 exit_server("open_sockets_smbd() failed");
1602 /* do a printer update now that all messaging has been set up,
1603 * before we allow clients to start connecting */
1604 if (!lp__disable_spoolss() &&
1605 (rpc_spoolss_daemon() != RPC_DAEMON_DISABLED
)) {
1606 printing_subsystem_update(ev_ctx
, msg_ctx
, false);
1610 /* make sure we always have a valid stackframe */
1611 frame
= talloc_stackframe();
1614 /* if we are running in the foreground then look for
1615 EOF on stdin, and exit if it happens. This allows
1616 us to die if the parent process dies
1617 Only do this on a pipe or socket, no other device.
1620 if (fstat(0, &st
) != 0) {
1623 if (S_ISFIFO(st
.st_mode
) || S_ISSOCK(st
.st_mode
)) {
1624 tevent_add_fd(ev_ctx
,
1633 smbd_parent_loop(ev_ctx
, parent
);
1635 exit_server_cleanly(NULL
);