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 "smbd/globals.h"
30
extern int dcelogin_atmost_once;
33
int smbd_server_fd(void)
38
static void smbd_set_server_fd(int fd)
43
int get_client_fd(void)
48
struct event_context *smbd_event_context(void)
50
if (!smbd_event_ctx) {
51
smbd_event_ctx = event_context_init(talloc_autofree_context());
53
if (!smbd_event_ctx) {
54
smb_panic("Could not init smbd event context");
56
return smbd_event_ctx;
59
struct messaging_context *smbd_messaging_context(void)
61
if (smbd_msg_ctx == NULL) {
62
smbd_msg_ctx = messaging_init(talloc_autofree_context(),
64
smbd_event_context());
66
if (smbd_msg_ctx == NULL) {
67
DEBUG(0, ("Could not init smbd messaging context.\n"));
72
struct memcache *smbd_memcache(void)
74
if (!smbd_memcache_ctx) {
75
smbd_memcache_ctx = memcache_init(talloc_autofree_context(),
76
lp_max_stat_cache_size()*1024);
78
if (!smbd_memcache_ctx) {
79
smb_panic("Could not init smbd memcache");
82
return smbd_memcache_ctx;
85
/*******************************************************************
86
What to do when smb.conf is updated.
87
********************************************************************/
89
static void smb_conf_updated(struct messaging_context *msg,
92
struct server_id server_id,
95
DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
96
"updated. Reloading.\n"));
97
change_to_root_user();
98
reload_services(False);
102
/*******************************************************************
103
Delete a statcache entry.
104
********************************************************************/
106
static void smb_stat_cache_delete(struct messaging_context *msg,
109
struct server_id server_id,
112
const char *name = (const char *)data->data;
113
DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
114
stat_cache_delete(name);
117
/****************************************************************************
118
Send a SIGTERM to our process group.
119
*****************************************************************************/
121
static void killkids(void)
123
if(am_parent) kill(0,SIGTERM);
126
/****************************************************************************
127
Process a sam sync message - not sure whether to do this here or
129
****************************************************************************/
131
static void msg_sam_sync(struct messaging_context *msg,
134
struct server_id server_id,
137
DEBUG(10, ("** sam sync message received, ignoring\n"));
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,
159
if (data->length != sizeof(sig)) {
161
DEBUG(0, ("Process %s sent bogus signal injection request\n",
162
procid_str_static(&src)));
166
sig = *(int *)data->data;
168
exit_server("internal error injected");
173
DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
174
procid_str_static(&src), sig, strsignal(sig)));
176
DEBUG(0, ("Process %s requested injection of signal %d\n",
177
procid_str_static(&src), sig));
180
kill(sys_getpid(), sig);
182
#endif /* DEVELOPER */
185
struct child_pid *prev, *next;
189
static void add_child_pid(pid_t pid)
191
struct child_pid *child;
193
if (lp_max_smbd_processes() == 0) {
194
/* Don't bother with the child list if we don't care anyway */
198
child = SMB_MALLOC_P(struct child_pid);
200
DEBUG(0, ("Could not add child struct -- malloc failed\n"));
204
DLIST_ADD(children, child);
208
static void remove_child_pid(pid_t pid, bool unclean_shutdown)
210
struct child_pid *child;
212
if (unclean_shutdown) {
213
/* a child terminated uncleanly so tickle all processes to see
214
if they can grab any of the pending locks
216
DEBUG(3,(__location__ " Unclean shutdown of pid %u\n", (unsigned int)pid));
217
messaging_send_buf(smbd_messaging_context(), procid_self(),
218
MSG_SMB_BRL_VALIDATE, NULL, 0);
219
message_send_all(smbd_messaging_context(),
220
MSG_SMB_UNLOCK, NULL, 0, NULL);
223
if (lp_max_smbd_processes() == 0) {
224
/* Don't bother with the child list if we don't care anyway */
228
for (child = children; child != NULL; child = child->next) {
229
if (child->pid == pid) {
230
struct child_pid *tmp = child;
231
DLIST_REMOVE(children, child);
238
DEBUG(0, ("Could not find child %d -- ignoring\n", (int)pid));
241
/****************************************************************************
242
Have we reached the process limit ?
243
****************************************************************************/
245
static bool allowable_number_of_smbd_processes(void)
247
int max_processes = lp_max_smbd_processes();
252
return num_children < max_processes;
255
static void smbd_sig_chld_handler(struct tevent_context *ev,
256
struct tevent_signal *se,
265
while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
266
bool unclean_shutdown = False;
268
/* If the child terminated normally, assume
269
it was an unclean shutdown unless the
272
if (WIFEXITED(status)) {
273
unclean_shutdown = WEXITSTATUS(status);
275
/* If the child terminated due to a signal
276
we always assume it was unclean.
278
if (WIFSIGNALED(status)) {
279
unclean_shutdown = True;
281
remove_child_pid(pid, unclean_shutdown);
285
static void smbd_setup_sig_chld_handler(void)
287
struct tevent_signal *se;
289
se = tevent_add_signal(smbd_event_context(),
290
smbd_event_context(),
292
smbd_sig_chld_handler,
295
exit_server("failed to setup SIGCHLD handler");
299
struct smbd_open_socket;
301
struct smbd_parent_context {
304
/* the list of listening sockets */
305
struct smbd_open_socket *sockets;
308
struct smbd_open_socket {
309
struct smbd_open_socket *prev, *next;
310
struct smbd_parent_context *parent;
312
struct tevent_fd *fde;
315
static void smbd_open_socket_close_fn(struct tevent_context *ev,
316
struct tevent_fd *fde,
320
/* this might be the socket_wrapper swrap_close() */
324
static void smbd_accept_connection(struct tevent_context *ev,
325
struct tevent_fd *fde,
329
struct smbd_open_socket *s = talloc_get_type_abort(private_data,
330
struct smbd_open_socket);
331
struct sockaddr_storage addr;
332
socklen_t in_addrlen = sizeof(addr);
335
smbd_set_server_fd(accept(s->fd,(struct sockaddr *)&addr,&in_addrlen));
337
if (smbd_server_fd() == -1 && errno == EINTR)
340
if (smbd_server_fd() == -1) {
341
DEBUG(0,("open_sockets_smbd: accept: %s\n",
346
if (s->parent->interactive) {
348
exit_server_cleanly("end of interactive mode");
352
if (!allowable_number_of_smbd_processes()) {
353
close(smbd_server_fd());
354
smbd_set_server_fd(-1);
360
NTSTATUS status = NT_STATUS_OK;
364
/* Stop zombies, the parent explicitly handles
365
* them, counting worker smbds. */
368
/* close our standard file
370
close_low_fds(False);
373
* Can't use TALLOC_FREE here. Nulling out the argument to it
374
* would overwrite memory we've just freed.
376
talloc_free(s->parent);
379
status = reinit_after_fork(smbd_messaging_context(),
380
smbd_event_context(), true);
381
if (!NT_STATUS_IS_OK(status)) {
382
if (NT_STATUS_EQUAL(status,
383
NT_STATUS_TOO_MANY_OPENED_FILES)) {
384
DEBUG(0,("child process cannot initialize "
385
"because too many files are open\n"));
388
DEBUG(0,("reinit_after_fork() failed\n"));
389
smb_panic("reinit_after_fork() failed");
392
smbd_setup_sig_term_handler();
393
smbd_setup_sig_hup_handler();
397
exit_server_cleanly("end of child");
399
} else if (pid < 0) {
400
DEBUG(0,("smbd_accept_connection: sys_fork() failed: %s\n",
404
/* The parent doesn't need this socket */
405
close(smbd_server_fd());
407
/* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
408
Clear the closed fd info out of server_fd --
409
and more importantly, out of client_fd in
410
util_sock.c, to avoid a possible
411
getpeername failure if we reopen the logs
412
and use %I in the filename.
415
smbd_set_server_fd(-1);
421
/* Force parent to check log size after
422
* spawning child. Fix from
423
* klausr@ITAP.Physik.Uni-Stuttgart.De. The
424
* parent smbd will log to logserver.smb. It
425
* writes only two messages for each child
426
* started/finished. But each child writes,
427
* say, 50 messages also in logserver.smb,
428
* begining with the debug_count of the
429
* parent, before the child opens its own log
430
* file logserver.client. In a worst case
431
* scenario the size of logserver.smb would be
432
* checked after about 50*50=2500 messages
435
force_check_log_size();
438
static bool smbd_open_one_socket(struct smbd_parent_context *parent,
439
const struct sockaddr_storage *ifss,
442
struct smbd_open_socket *s;
444
s = talloc(parent, struct smbd_open_socket);
450
s->fd = open_socket_in(SOCK_STREAM,
452
parent->sockets == NULL ? 0 : 2,
456
DEBUG(0,("smbd_open_once_socket: open_socket_in: "
457
"%s\n", strerror(errno)));
460
* We ignore an error here, as we've done before
465
/* ready to listen */
466
set_socket_options(s->fd, "SO_KEEPALIVE");
467
set_socket_options(s->fd, lp_socket_options());
469
/* Set server socket to
470
* non-blocking for the accept. */
471
set_blocking(s->fd, False);
473
if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
474
DEBUG(0,("open_sockets_smbd: listen: "
475
"%s\n", strerror(errno)));
481
s->fde = tevent_add_fd(smbd_event_context(),
483
s->fd, TEVENT_FD_READ,
484
smbd_accept_connection,
487
DEBUG(0,("open_sockets_smbd: "
488
"tevent_add_fd: %s\n",
494
tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
496
DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
501
/****************************************************************************
502
Open the socket communication.
503
****************************************************************************/
505
static bool open_sockets_smbd(struct smbd_parent_context *parent,
506
const char *smb_ports)
508
int num_interfaces = iface_count();
511
unsigned dns_port = 0;
518
smbd_setup_sig_chld_handler();
520
/* use a reasonable default set of ports - listing on 445 and 139 */
522
ports = lp_smb_ports();
523
if (!ports || !*ports) {
524
ports = talloc_strdup(talloc_tos(), SMB_PORTS);
526
ports = talloc_strdup(talloc_tos(), ports);
529
ports = talloc_strdup(talloc_tos(), smb_ports);
532
if (lp_interfaces() && lp_bind_interfaces_only()) {
533
/* We have been given an interfaces line, and been
534
told to only bind to those interfaces. Create a
535
socket per interface and bind to only these.
538
/* Now open a listen socket for each of the
540
for(i = 0; i < num_interfaces; i++) {
541
const struct sockaddr_storage *ifss =
542
iface_n_sockaddr_storage(i);
547
DEBUG(0,("open_sockets_smbd: "
548
"interface %d has NULL IP address !\n",
554
next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
555
unsigned port = atoi(tok);
556
if (port == 0 || port > 0xffff) {
560
if (!smbd_open_one_socket(parent, ifss, port)) {
566
/* Just bind to 0.0.0.0 - accept connections
571
const char *sock_addr = lp_socket_address();
573
const char *sock_ptr;
575
if (strequal(sock_addr, "0.0.0.0") ||
576
strequal(sock_addr, "::")) {
578
sock_addr = "::,0.0.0.0";
580
sock_addr = "0.0.0.0";
584
for (sock_ptr=sock_addr;
585
next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
586
for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) {
587
struct sockaddr_storage ss;
589
unsigned port = atoi(tok);
590
if (port == 0 || port > 0xffff) {
594
/* Keep the first port for mDNS service
601
/* open an incoming socket */
602
if (!interpret_string_addr(&ss, sock_tok,
603
AI_NUMERICHOST|AI_PASSIVE)) {
607
if (!smbd_open_one_socket(parent, &ss, port)) {
614
if (parent->sockets == NULL) {
615
DEBUG(0,("open_sockets_smbd: No "
616
"sockets available to bind to.\n"));
620
/* Setup the main smbd so that we can get messages. Note that
621
do this after starting listening. This is needed as when in
622
clustered mode, ctdb won't allow us to start doing database
623
operations until it has gone thru a full startup, which
624
includes checking to see that smbd is listening. */
625
claim_connection(NULL,"",
626
FLAG_MSG_GENERAL|FLAG_MSG_SMBD|FLAG_MSG_DBWRAP);
628
/* Listen to messages */
630
messaging_register(smbd_messaging_context(), NULL,
631
MSG_SMB_SAM_SYNC, msg_sam_sync);
632
messaging_register(smbd_messaging_context(), NULL,
633
MSG_SHUTDOWN, msg_exit_server);
634
messaging_register(smbd_messaging_context(), NULL,
635
MSG_SMB_FILE_RENAME, msg_file_was_renamed);
636
messaging_register(smbd_messaging_context(), NULL,
637
MSG_SMB_CONF_UPDATED, smb_conf_updated);
638
messaging_register(smbd_messaging_context(), NULL,
639
MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete);
640
brl_register_msgs(smbd_messaging_context());
642
#ifdef CLUSTER_SUPPORT
643
if (lp_clustering()) {
644
ctdbd_register_reconfigure(messaging_ctdbd_connection());
649
messaging_register(smbd_messaging_context(), NULL,
650
MSG_SMB_INJECT_FAULT, msg_inject_fault);
654
#ifdef WITH_DNSSD_SUPPORT
655
smbd_setup_mdns_registration(smbd_event_context(),
658
#ifdef WITH_AVAHI_SUPPORT
661
avahi_conn = avahi_start_register(
662
smbd_event_context(), smbd_event_context(), dns_port);
663
if (avahi_conn == NULL) {
664
DEBUG(10, ("avahi_start_register failed\n"));
672
static void smbd_parent_loop(struct smbd_parent_context *parent)
674
/* now accept incoming connections - forking a new process
675
for each incoming connection */
676
DEBUG(2,("waiting for connections\n"));
679
TALLOC_CTX *frame = talloc_stackframe();
681
ret = tevent_loop_once(smbd_event_context());
683
exit_server_cleanly("tevent_loop_once() error");
689
/* NOTREACHED return True; */
692
/****************************************************************************
694
**************************************************************************/
695
void reload_printers(void)
698
int n_services = lp_numservices();
699
int pnum = lp_servicenumber(PRINTERS_NAME);
702
if (!lp_load_printers()
703
&& (lp_auto_services() == NULL || !strcmp(lp_auto_services(),"")))
708
/* remove stale printers */
709
for (snum = 0; snum < n_services; snum++) {
710
/* avoid removing PRINTERS_NAME or non-autoloaded printers */
711
if (snum == pnum || !(lp_snum_ok(snum) && lp_print_ok(snum) &&
712
lp_autoloaded(snum)))
715
pname = lp_printername(snum);
716
if (!pcap_printername_ok(pname)) {
717
DEBUG(3, ("removing stale printer %s\n", pname));
719
if (is_printer_published(NULL, snum, NULL))
720
nt_printer_publish(NULL, snum, DSPRINT_UNPUBLISH);
721
del_a_printer(pname);
722
lp_killservice(snum);
729
/****************************************************************************
730
Reload the services file.
731
**************************************************************************/
733
bool reload_services(bool test)
738
char *fname = lp_configfile();
739
if (file_exist(fname) &&
740
!strcsequal(fname, get_dyn_CONFIGFILE())) {
741
set_dyn_CONFIGFILE(fname);
748
if (test && !lp_file_list_changed())
751
lp_killunused(conn_snum_used);
753
ret = lp_load(get_dyn_CONFIGFILE(), False, False, True, True);
757
/* perhaps the config filename is now set */
759
reload_services(True);
765
if (smbd_server_fd() != -1) {
766
set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
767
set_socket_options(smbd_server_fd(), lp_socket_options());
770
mangle_reset_cache();
773
/* this forces service parameters to be flushed */
774
set_current_service(NULL,0,True);
779
/****************************************************************************
781
****************************************************************************/
783
/* Reasons for shutting down a server process. */
784
enum server_exit_reason { SERVER_EXIT_NORMAL, SERVER_EXIT_ABNORMAL };
786
static void exit_server_common(enum server_exit_reason how,
787
const char *const reason) _NORETURN_;
789
static void exit_server_common(enum server_exit_reason how,
790
const char *const reason)
796
exit_firsttime = false;
798
change_to_root_user();
800
if (negprot_global_auth_context) {
801
(negprot_global_auth_context->free)(&negprot_global_auth_context);
804
had_open_conn = conn_close_all();
806
invalidate_all_vuids();
808
/* 3 second timeout. */
809
print_notify_send_messages(smbd_messaging_context(), 3);
811
/* delete our entry in the connections database. */
812
yield_connection(NULL,"");
815
if (dcelogin_atmost_once) {
821
/* Destroy Samba DMAPI session only if we are master smbd process */
823
if (!dmapi_destroy_session()) {
824
DEBUG(0,("Unable to close Samba DMAPI session\n"));
832
if (how != SERVER_EXIT_NORMAL) {
833
int oldlevel = DEBUGLEVEL;
838
DEBUG(0,("Abnormal server exit: %s\n",
839
reason ? reason : "no explanation provided"));
844
DEBUGLEVEL = oldlevel;
848
DEBUG(3,("Server exit (%s)\n",
849
(reason ? reason : "normal exit")));
855
/* if we had any open SMB connections when we exited then we
856
need to tell the parent smbd so that it can trigger a retry
857
of any locks we may have been holding or open files we were
866
void exit_server(const char *const explanation)
868
exit_server_common(SERVER_EXIT_ABNORMAL, explanation);
871
void exit_server_cleanly(const char *const explanation)
873
exit_server_common(SERVER_EXIT_NORMAL, explanation);
876
void exit_server_fault(void)
878
exit_server("critical server fault");
881
/****************************************************************************
882
Initialise connect, service and file structs.
883
****************************************************************************/
885
static bool init_structs(void )
888
* Set the machine NETBIOS name if not already
889
* set from the config file.
907
/****************************************************************************
909
****************************************************************************/
911
/* Declare prototype for build_options() to avoid having to run it through
912
mkproto.h. Mixing $(builddir) and $(srcdir) source files in the current
913
prototype generation system is too complicated. */
915
extern void build_options(bool screen);
917
int main(int argc,const char *argv[])
919
/* shall I run as a daemon */
920
bool is_daemon = false;
921
bool interactive = false;
923
bool no_process_group = false;
924
bool log_stdout = false;
926
char *profile_level = NULL;
929
bool print_build_options = False;
934
OPT_NO_PROCESS_GROUP,
937
struct poptOption long_options[] = {
939
{"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" },
940
{"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"},
941
{"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" },
942
{"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
943
{"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
944
{"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
945
{"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
946
{"profiling-level", 'P', POPT_ARG_STRING, &profile_level, 0, "Set profiling level","PROFILE_LEVEL"},
948
POPT_COMMON_DYNCONFIG
951
struct smbd_parent_context *parent = NULL;
952
TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
958
#ifdef HAVE_SET_AUTH_PARAMETERS
959
set_auth_parameters(argc,argv);
962
pc = poptGetContext("smbd", argc, argv, long_options, 0);
963
while((opt = poptGetNextOpt(pc)) != -1) {
968
case OPT_INTERACTIVE:
974
case OPT_NO_PROCESS_GROUP:
975
no_process_group = true;
981
print_build_options = True;
984
d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
985
poptBadOption(pc, 0), poptStrerror(opt));
986
poptPrintUsage(pc, stderr, 0);
997
setup_logging(argv[0],log_stdout);
999
if (print_build_options) {
1000
build_options(True); /* Display output to screen as well as debug */
1007
/* needed for SecureWare on SCO */
1013
set_remote_machine_name("smbd", False);
1015
if (interactive && (DEBUGLEVEL >= 9)) {
1016
talloc_enable_leak_report();
1019
if (log_stdout && Fork) {
1020
DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
1024
/* we want to re-seed early to prevent time delays causing
1025
client problems at a later date. (tridge) */
1026
generate_random_buffer(NULL, 0);
1028
/* make absolutely sure we run as root - to handle cases where people
1029
are crazy enough to have it setuid */
1031
gain_root_privilege();
1032
gain_root_group_privilege();
1035
* Ensure we have CAP_KILL capability set on Linux,
1036
* where we need this to communicate with threads.
1037
* This is inherited by new threads, but not by new
1038
* processes across exec().
1040
set_effective_capability(KILL_CAPABILITY);
1042
fault_setup((void (*)(void *))exit_server_fault);
1043
dump_core_setup("smbd");
1045
/* we are never interested in SIGPIPE */
1046
BlockSignals(True,SIGPIPE);
1049
/* we are never interested in SIGFPE */
1050
BlockSignals(True,SIGFPE);
1053
#if defined(SIGUSR2)
1054
/* We are no longer interested in USR2 */
1055
BlockSignals(True,SIGUSR2);
1058
/* POSIX demands that signals are inherited. If the invoking process has
1059
* these signals masked, we will have problems, as we won't recieve them. */
1060
BlockSignals(False, SIGHUP);
1061
BlockSignals(False, SIGUSR1);
1062
BlockSignals(False, SIGTERM);
1064
/* Ensure we leave no zombies until we
1065
* correctly set up child handling below. */
1069
/* we want total control over the permissions on created files,
1070
so set our umask to 0 */
1077
DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1078
DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1080
DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1081
(int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1083
/* Output the build options to the debug log */
1084
build_options(False);
1086
if (sizeof(uint16) < 2 || sizeof(uint32) < 4) {
1087
DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1091
if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1092
DEBUG(0, ("error opening config file\n"));
1096
if (smbd_messaging_context() == NULL)
1099
if (!reload_services(False))
1105
if (!profile_setup(smbd_messaging_context(), False)) {
1106
DEBUG(0,("ERROR: failed to setup profiling\n"));
1109
if (profile_level != NULL) {
1110
int pl = atoi(profile_level);
1111
struct server_id src;
1113
DEBUG(1, ("setting profiling level: %s\n",profile_level));
1115
set_profile_level(pl, src);
1119
DEBUG(3,( "loaded services\n"));
1121
if (!is_daemon && !is_a_socket(0)) {
1123
DEBUG(0,("standard input is not a socket, assuming -D option\n"));
1126
* Setting is_daemon here prevents us from eventually calling
1127
* the open_sockets_inetd()
1133
if (is_daemon && !interactive) {
1134
DEBUG( 3, ( "Becoming a daemon.\n" ) );
1135
become_daemon(Fork, no_process_group);
1140
* If we're interactive we want to set our own process group for
1141
* signal management.
1143
if (interactive && !no_process_group)
1144
setpgid( (pid_t)0, (pid_t)0);
1147
if (!directory_exist(lp_lockdir()))
1148
mkdir(lp_lockdir(), 0755);
1151
pidfile_create("smbd");
1153
if (!NT_STATUS_IS_OK(reinit_after_fork(smbd_messaging_context(),
1154
smbd_event_context(), false))) {
1155
DEBUG(0,("reinit_after_fork() failed\n"));
1159
smbd_setup_sig_term_handler();
1160
smbd_setup_sig_hup_handler();
1162
/* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1164
if (smbd_memcache() == NULL) {
1168
memcache_set_global(smbd_memcache());
1170
/* Initialise the password backed before the global_sam_sid
1171
to ensure that we fetch from ldap before we make a domain sid up */
1173
if(!initialize_password_db(False, smbd_event_context()))
1176
if (!secrets_init()) {
1177
DEBUG(0, ("ERROR: smbd can not open secrets.tdb\n"));
1181
if(!get_global_sam_sid()) {
1182
DEBUG(0,("ERROR: Samba cannot create a SAM SID.\n"));
1186
if (!session_init())
1189
if (!connections_init(True))
1192
if (!locking_init())
1197
if (!W_ERROR_IS_OK(registry_init_full()))
1201
if (!init_svcctl_db())
1205
if (!print_backend_init(smbd_messaging_context()))
1208
if (!init_guest_info()) {
1209
DEBUG(0,("ERROR: failed to setup guest info.\n"));
1213
/* only start the background queue daemon if we are
1214
running as a daemon -- bad things will happen if
1215
smbd is launched via inetd and we fork a copy of
1218
if (is_daemon && !interactive
1219
&& lp_parm_bool(-1, "smbd", "backgroundqueue", true)) {
1220
start_background_queue();
1227
/* Started from inetd. fd 0 is the socket. */
1228
/* We will abort gracefully when the client or remote system
1230
smbd_set_server_fd(dup(0));
1232
/* close our standard file descriptors */
1233
close_low_fds(False); /* Don't close stderr */
1240
smbd_setup_sig_chld_handler();
1244
exit_server_cleanly(NULL);
1248
parent = talloc_zero(smbd_event_context(), struct smbd_parent_context);
1250
exit_server("talloc(struct smbd_parent_context) failed");
1252
parent->interactive = interactive;
1254
if (!open_sockets_smbd(parent, ports))
1255
exit_server("open_sockets_smbd() failed");
1259
smbd_parent_loop(parent);
1261
exit_server_cleanly(NULL);