1/*
2   Unix SMB/CIFS implementation.
3   Main SMB server routines
4   Copyright (C) Andrew Tridgell		1992-1998
5   Copyright (C) Martin Pool			2002
6   Copyright (C) Jelmer Vernooij		2002-2003
7   Copyright (C) Volker Lendecke		1993-2007
8   Copyright (C) Jeremy Allison			1993-2007
9
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.
14
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.
19
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/>.
22*/
23
24#include "includes.h"
25#include "smbd/globals.h"
26
27static_decl_rpc;
28
29#ifdef WITH_DFS
30extern int dcelogin_atmost_once;
31#endif /* WITH_DFS */
32
33int smbd_server_fd(void)
34{
35	return server_fd;
36}
37
38static void smbd_set_server_fd(int fd)
39{
40	server_fd = fd;
41}
42
43int get_client_fd(void)
44{
45	return server_fd;
46}
47
48struct event_context *smbd_event_context(void)
49{
50	if (!smbd_event_ctx) {
51		smbd_event_ctx = event_context_init(talloc_autofree_context());
52	}
53	if (!smbd_event_ctx) {
54		smb_panic("Could not init smbd event context");
55	}
56	return smbd_event_ctx;
57}
58
59struct messaging_context *smbd_messaging_context(void)
60{
61	if (smbd_msg_ctx == NULL) {
62		smbd_msg_ctx = messaging_init(talloc_autofree_context(),
63					      server_id_self(),
64					      smbd_event_context());
65	}
66	if (smbd_msg_ctx == NULL) {
67		DEBUG(0, ("Could not init smbd messaging context.\n"));
68	}
69	return smbd_msg_ctx;
70}
71
72struct memcache *smbd_memcache(void)
73{
74	if (!smbd_memcache_ctx) {
75		smbd_memcache_ctx = memcache_init(talloc_autofree_context(),
76						  lp_max_stat_cache_size()*1024);
77	}
78	if (!smbd_memcache_ctx) {
79		smb_panic("Could not init smbd memcache");
80	}
81
82	return smbd_memcache_ctx;
83}
84
85/*******************************************************************
86 What to do when smb.conf is updated.
87 ********************************************************************/
88
89static void smb_conf_updated(struct messaging_context *msg,
90			     void *private_data,
91			     uint32_t msg_type,
92			     struct server_id server_id,
93			     DATA_BLOB *data)
94{
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);
99}
100
101
102/*******************************************************************
103 Delete a statcache entry.
104 ********************************************************************/
105
106static void smb_stat_cache_delete(struct messaging_context *msg,
107				  void *private_data,
108				  uint32_t msg_tnype,
109				  struct server_id server_id,
110				  DATA_BLOB *data)
111{
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);
115}
116
117/****************************************************************************
118  Send a SIGTERM to our process group.
119*****************************************************************************/
120
121static void  killkids(void)
122{
123	if(am_parent) kill(0,SIGTERM);
124}
125
126/****************************************************************************
127 Process a sam sync message - not sure whether to do this here or
128 somewhere else.
129****************************************************************************/
130
131static void msg_sam_sync(struct messaging_context *msg,
132			 void *private_data,
133			 uint32_t msg_type,
134			 struct server_id server_id,
135			 DATA_BLOB *data)
136{
137        DEBUG(10, ("** sam sync message received, ignoring\n"));
138}
139
140static void msg_exit_server(struct messaging_context *msg,
141			    void *private_data,
142			    uint32_t msg_type,
143			    struct server_id server_id,
144			    DATA_BLOB *data)
145{
146	DEBUG(3, ("got a SHUTDOWN message\n"));
147	exit_server_cleanly(NULL);
148}
149
150#ifdef DEVELOPER
151static void msg_inject_fault(struct messaging_context *msg,
152			     void *private_data,
153			     uint32_t msg_type,
154			     struct server_id src,
155			     DATA_BLOB *data)
156{
157	int sig;
158
159	if (data->length != sizeof(sig)) {
160
161		DEBUG(0, ("Process %s sent bogus signal injection request\n",
162			  procid_str_static(&src)));
163		return;
164	}
165
166	sig = *(int *)data->data;
167	if (sig == -1) {
168		exit_server("internal error injected");
169		return;
170	}
171
172#if HAVE_STRSIGNAL
173	DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
174		  procid_str_static(&src), sig, strsignal(sig)));
175#else
176	DEBUG(0, ("Process %s requested injection of signal %d\n",
177		  procid_str_static(&src), sig));
178#endif
179
180	kill(sys_getpid(), sig);
181}
182#endif /* DEVELOPER */
183
184/*
185 * Parent smbd process sets its own debug level first and then
186 * sends a message to all the smbd children to adjust their debug
187 * level to that of the parent.
188 */
189
190static void smbd_msg_debug(struct messaging_context *msg_ctx,
191			   void *private_data,
192			   uint32_t msg_type,
193			   struct server_id server_id,
194			   DATA_BLOB *data)
195{
196	struct child_pid *child;
197
198	debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
199
200	for (child = children; child != NULL; child = child->next) {
201		messaging_send_buf(msg_ctx, pid_to_procid(child->pid),
202				   MSG_DEBUG,
203				   data->data,
204				   strlen((char *) data->data) + 1);
205	}
206}
207
208static void add_child_pid(pid_t pid)
209{
210	struct child_pid *child;
211
212	child = SMB_MALLOC_P(struct child_pid);
213	if (child == NULL) {
214		DEBUG(0, ("Could not add child struct -- malloc failed\n"));
215		return;
216	}
217	child->pid = pid;
218	DLIST_ADD(children, child);
219	num_children += 1;
220}
221
222/*
223  at most every smbd:cleanuptime seconds (default 20), we scan the BRL
224  and locking database for entries to cleanup. As a side effect this
225  also cleans up dead entries in the connections database (due to the
226  traversal in message_send_all()
227
228  Using a timer for this prevents a flood of traversals when a large
229  number of clients disconnect at the same time (perhaps due to a
230  network outage).
231*/
232
233static void cleanup_timeout_fn(struct event_context *event_ctx,
234				struct timed_event *te,
235				struct timeval now,
236				void *private_data)
237{
238	struct timed_event **cleanup_te = (struct timed_event **)private_data;
239
240	DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
241	message_send_all(smbd_messaging_context(), MSG_SMB_UNLOCK, NULL, 0, NULL);
242	messaging_send_buf(smbd_messaging_context(), procid_self(),
243				MSG_SMB_BRL_VALIDATE, NULL, 0);
244	/* mark the cleanup as having been done */
245	(*cleanup_te) = NULL;
246}
247
248static void remove_child_pid(pid_t pid, bool unclean_shutdown)
249{
250	struct child_pid *child;
251	static struct timed_event *cleanup_te;
252
253	if (unclean_shutdown) {
254		/* a child terminated uncleanly so tickle all
255		   processes to see if they can grab any of the
256		   pending locks
257                */
258		DEBUG(3,(__location__ " Unclean shutdown of pid %u\n",
259			(unsigned int)pid));
260		if (!cleanup_te) {
261			/* call the cleanup timer, but not too often */
262			int cleanup_time = lp_parm_int(-1, "smbd", "cleanuptime", 20);
263			cleanup_te = event_add_timed(smbd_event_context(), NULL,
264						timeval_current_ofs(cleanup_time, 0),
265						cleanup_timeout_fn,
266						&cleanup_te);
267			DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
268		}
269	}
270
271	for (child = children; child != NULL; child = child->next) {
272		if (child->pid == pid) {
273			struct child_pid *tmp = child;
274			DLIST_REMOVE(children, child);
275			SAFE_FREE(tmp);
276			num_children -= 1;
277			return;
278		}
279	}
280
281	DEBUG(0, ("Could not find child %d -- ignoring\n", (int)pid));
282}
283
284/****************************************************************************
285 Have we reached the process limit ?
286****************************************************************************/
287
288static bool allowable_number_of_smbd_processes(void)
289{
290	int max_processes = lp_max_smbd_processes();
291
292	if (!max_processes)
293		return True;
294
295	return num_children < max_processes;
296}
297
298static void smbd_sig_chld_handler(struct tevent_context *ev,
299				  struct tevent_signal *se,
300				  int signum,
301				  int count,
302				  void *siginfo,
303				  void *private_data)
304{
305	pid_t pid;
306	int status;
307
308	while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
309		bool unclean_shutdown = False;
310
311		/* If the child terminated normally, assume
312		   it was an unclean shutdown unless the
313		   status is 0
314		*/
315		if (WIFEXITED(status)) {
316			unclean_shutdown = WEXITSTATUS(status);
317		}
318		/* If the child terminated due to a signal
319		   we always assume it was unclean.
320		*/
321		if (WIFSIGNALED(status)) {
322			unclean_shutdown = True;
323		}
324		remove_child_pid(pid, unclean_shutdown);
325	}
326}
327
328static void smbd_setup_sig_chld_handler(void)
329{
330	struct tevent_signal *se;
331
332	se = tevent_add_signal(smbd_event_context(),
333			       smbd_event_context(),
334			       SIGCHLD, 0,
335			       smbd_sig_chld_handler,
336			       NULL);
337	if (!se) {
338		exit_server("failed to setup SIGCHLD handler");
339	}
340}
341
342struct smbd_open_socket;
343
344struct smbd_parent_context {
345	bool interactive;
346
347	/* the list of listening sockets */
348	struct smbd_open_socket *sockets;
349};
350
351struct smbd_open_socket {
352	struct smbd_open_socket *prev, *next;
353	struct smbd_parent_context *parent;
354	int fd;
355	struct tevent_fd *fde;
356};
357
358static void smbd_open_socket_close_fn(struct tevent_context *ev,
359				      struct tevent_fd *fde,
360				      int fd,
361				      void *private_data)
362{
363	/* this might be the socket_wrapper swrap_close() */
364	close(fd);
365}
366
367static void smbd_accept_connection(struct tevent_context *ev,
368				   struct tevent_fd *fde,
369				   uint16_t flags,
370				   void *private_data)
371{
372	struct smbd_open_socket *s = talloc_get_type_abort(private_data,
373				     struct smbd_open_socket);
374	struct sockaddr_storage addr;
375	socklen_t in_addrlen = sizeof(addr);
376	pid_t pid = 0;
377
378	smbd_set_server_fd(accept(s->fd,(struct sockaddr *)&addr,&in_addrlen));
379
380	if (smbd_server_fd() == -1 && errno == EINTR)
381		return;
382
383	if (smbd_server_fd() == -1) {
384		DEBUG(0,("open_sockets_smbd: accept: %s\n",
385			 strerror(errno)));
386		return;
387	}
388
389	if (s->parent->interactive) {
390		smbd_process();
391		exit_server_cleanly("end of interactive mode");
392		return;
393	}
394
395	if (!allowable_number_of_smbd_processes()) {
396		close(smbd_server_fd());
397		smbd_set_server_fd(-1);
398		return;
399	}
400
401	pid = sys_fork();
402	if (pid == 0) {
403		NTSTATUS status = NT_STATUS_OK;
404		/* Child code ... */
405		am_parent = 0;
406
407		/* Stop zombies, the parent explicitly handles
408		 * them, counting worker smbds. */
409		CatchChild();
410
411		/* close our standard file
412		   descriptors */
413		close_low_fds(False);
414
415		/*
416		 * Can't use TALLOC_FREE here. Nulling out the argument to it
417		 * would overwrite memory we've just freed.
418		 */
419		talloc_free(s->parent);
420		s = NULL;
421
422		status = reinit_after_fork(smbd_messaging_context(),
423					   smbd_event_context(), true);
424		if (!NT_STATUS_IS_OK(status)) {
425			if (NT_STATUS_EQUAL(status,
426					    NT_STATUS_TOO_MANY_OPENED_FILES)) {
427				DEBUG(0,("child process cannot initialize "
428					 "because too many files are open\n"));
429				goto exit;
430			}
431			DEBUG(0,("reinit_after_fork() failed\n"));
432			smb_panic("reinit_after_fork() failed");
433		}
434
435		smbd_setup_sig_term_handler();
436		smbd_setup_sig_hup_handler();
437
438		smbd_process();
439	 exit:
440		exit_server_cleanly("end of child");
441		return;
442	} else if (pid < 0) {
443		DEBUG(0,("smbd_accept_connection: sys_fork() failed: %s\n",
444			 strerror(errno)));
445	}
446
447	/* The parent doesn't need this socket */
448	close(smbd_server_fd());
449
450	/* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
451		Clear the closed fd info out of server_fd --
452		and more importantly, out of client_fd in
453		util_sock.c, to avoid a possible
454		getpeername failure if we reopen the logs
455		and use %I in the filename.
456	*/
457
458	smbd_set_server_fd(-1);
459
460	if (pid != 0) {
461		add_child_pid(pid);
462	}
463
464	/* Force parent to check log size after
465	 * spawning child.  Fix from
466	 * klausr@ITAP.Physik.Uni-Stuttgart.De.  The
467	 * parent smbd will log to logserver.smb.  It
468	 * writes only two messages for each child
469	 * started/finished. But each child writes,
470	 * say, 50 messages also in logserver.smb,
471	 * begining with the debug_count of the
472	 * parent, before the child opens its own log
473	 * file logserver.client. In a worst case
474	 * scenario the size of logserver.smb would be
475	 * checked after about 50*50=2500 messages
476	 * (ca. 100kb).
477	 * */
478	force_check_log_size();
479}
480
481static bool smbd_open_one_socket(struct smbd_parent_context *parent,
482				 const struct sockaddr_storage *ifss,
483				 uint16_t port)
484{
485	struct smbd_open_socket *s;
486
487	s = talloc(parent, struct smbd_open_socket);
488	if (!s) {
489		return false;
490	}
491
492	s->parent = parent;
493	s->fd = open_socket_in(SOCK_STREAM,
494			       port,
495			       parent->sockets == NULL ? 0 : 2,
496			       ifss,
497			       true);
498	if (s->fd == -1) {
499		DEBUG(0,("smbd_open_once_socket: open_socket_in: "
500			"%s\n", strerror(errno)));
501		TALLOC_FREE(s);
502		/*
503		 * We ignore an error here, as we've done before
504		 */
505		return true;
506	}
507
508	/* ready to listen */
509	set_socket_options(s->fd, "SO_KEEPALIVE");
510	set_socket_options(s->fd, lp_socket_options());
511
512	/* Set server socket to
513	 * non-blocking for the accept. */
514	set_blocking(s->fd, False);
515
516	if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
517		DEBUG(0,("open_sockets_smbd: listen: "
518			"%s\n", strerror(errno)));
519			close(s->fd);
520		TALLOC_FREE(s);
521		return false;
522	}
523
524	s->fde = tevent_add_fd(smbd_event_context(),
525			       s,
526			       s->fd, TEVENT_FD_READ,
527			       smbd_accept_connection,
528			       s);
529	if (!s->fde) {
530		DEBUG(0,("open_sockets_smbd: "
531			 "tevent_add_fd: %s\n",
532			 strerror(errno)));
533		close(s->fd);
534		TALLOC_FREE(s);
535		return false;
536	}
537	tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
538
539	DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
540
541	return true;
542}
543
544/****************************************************************************
545 Open the socket communication.
546****************************************************************************/
547
548static bool open_sockets_smbd(struct smbd_parent_context *parent,
549			      const char *smb_ports)
550{
551	int num_interfaces = iface_count();
552	int i;
553	char *ports;
554	unsigned dns_port = 0;
555
556#ifdef HAVE_ATEXIT
557	atexit(killkids);
558#endif
559
560	/* Stop zombies */
561	smbd_setup_sig_chld_handler();
562
563	/* use a reasonable default set of ports - listing on 445 and 139 */
564	if (!smb_ports) {
565		ports = lp_smb_ports();
566		if (!ports || !*ports) {
567			ports = talloc_strdup(talloc_tos(), SMB_PORTS);
568		} else {
569			ports = talloc_strdup(talloc_tos(), ports);
570		}
571	} else {
572		ports = talloc_strdup(talloc_tos(), smb_ports);
573	}
574
575	if (lp_interfaces() && lp_bind_interfaces_only()) {
576		/* We have been given an interfaces line, and been
577		   told to only bind to those interfaces. Create a
578		   socket per interface and bind to only these.
579		*/
580
581		/* Now open a listen socket for each of the
582		   interfaces. */
583		for(i = 0; i < num_interfaces; i++) {
584			const struct sockaddr_storage *ifss =
585					iface_n_sockaddr_storage(i);
586			char *tok;
587			const char *ptr;
588
589			if (ifss == NULL) {
590				DEBUG(0,("open_sockets_smbd: "
591					"interface %d has NULL IP address !\n",
592					i));
593				continue;
594			}
595
596			for (ptr=ports;
597			     next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
598				unsigned port = atoi(tok);
599				if (port == 0 || port > 0xffff) {
600					continue;
601				}
602
603				if (!smbd_open_one_socket(parent, ifss, port)) {
604					return false;
605				}
606			}
607		}
608	} else {
609		/* Just bind to 0.0.0.0 - accept connections
610		   from anywhere. */
611
612		char *tok;
613		const char *ptr;
614		const char *sock_addr = lp_socket_address();
615		char *sock_tok;
616		const char *sock_ptr;
617
618		if (strequal(sock_addr, "0.0.0.0") ||
619		    strequal(sock_addr, "::")) {
620#if HAVE_IPV6
621			sock_addr = "::,0.0.0.0";
622#else
623			sock_addr = "0.0.0.0";
624#endif
625		}
626
627		for (sock_ptr=sock_addr;
628		     next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
629			for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) {
630				struct sockaddr_storage ss;
631
632				unsigned port = atoi(tok);
633				if (port == 0 || port > 0xffff) {
634					continue;
635				}
636
637				/* Keep the first port for mDNS service
638				 * registration.
639				 */
640				if (dns_port == 0) {
641					dns_port = port;
642				}
643
644				/* open an incoming socket */
645				if (!interpret_string_addr(&ss, sock_tok,
646						AI_NUMERICHOST|AI_PASSIVE)) {
647					continue;
648				}
649
650				if (!smbd_open_one_socket(parent, &ss, port)) {
651					return false;
652				}
653			}
654		}
655	}
656
657	if (parent->sockets == NULL) {
658		DEBUG(0,("open_sockets_smbd: No "
659			"sockets available to bind to.\n"));
660		return false;
661	}
662
663	/* Setup the main smbd so that we can get messages. Note that
664	   do this after starting listening. This is needed as when in
665	   clustered mode, ctdb won't allow us to start doing database
666	   operations until it has gone thru a full startup, which
667	   includes checking to see that smbd is listening. */
668	claim_connection(NULL,"",
669			 FLAG_MSG_GENERAL|FLAG_MSG_SMBD|FLAG_MSG_DBWRAP);
670
671        /* Listen to messages */
672
673	messaging_register(smbd_messaging_context(), NULL,
674			   MSG_SMB_SAM_SYNC, msg_sam_sync);
675	messaging_register(smbd_messaging_context(), NULL,
676			   MSG_SHUTDOWN, msg_exit_server);
677	messaging_register(smbd_messaging_context(), NULL,
678			   MSG_SMB_FILE_RENAME, msg_file_was_renamed);
679	messaging_register(smbd_messaging_context(), NULL,
680			   MSG_SMB_CONF_UPDATED, smb_conf_updated);
681	messaging_register(smbd_messaging_context(), NULL,
682			   MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete);
683	messaging_register(smbd_messaging_context(), NULL,
684			   MSG_DEBUG, smbd_msg_debug);
685	brl_register_msgs(smbd_messaging_context());
686
687#ifdef CLUSTER_SUPPORT
688	if (lp_clustering()) {
689		ctdbd_register_reconfigure(messaging_ctdbd_connection());
690	}
691#endif
692
693#ifdef DEVELOPER
694	messaging_register(smbd_messaging_context(), NULL,
695			   MSG_SMB_INJECT_FAULT, msg_inject_fault);
696#endif
697
698	if (dns_port != 0) {
699#ifdef WITH_DNSSD_SUPPORT
700		smbd_setup_mdns_registration(smbd_event_context(),
701					     parent, dns_port);
702#endif
703#ifdef WITH_AVAHI_SUPPORT
704		void *avahi_conn;
705
706		avahi_conn = avahi_start_register(
707			smbd_event_context(), smbd_event_context(), dns_port);
708		if (avahi_conn == NULL) {
709			DEBUG(10, ("avahi_start_register failed\n"));
710		}
711#endif
712	}
713
714	return true;
715}
716
717static void smbd_parent_loop(struct smbd_parent_context *parent)
718{
719	/* now accept incoming connections - forking a new process
720	   for each incoming connection */
721	DEBUG(2,("waiting for connections\n"));
722	while (1) {
723		int ret;
724		TALLOC_CTX *frame = talloc_stackframe();
725
726		ret = tevent_loop_once(smbd_event_context());
727		if (ret != 0) {
728			exit_server_cleanly("tevent_loop_once() error");
729		}
730
731		TALLOC_FREE(frame);
732	} /* end while 1 */
733
734/* NOTREACHED	return True; */
735}
736
737/****************************************************************************
738 Reload printers
739**************************************************************************/
740void reload_printers(void)
741{
742	int snum;
743	int n_services = lp_numservices();
744	int pnum = lp_servicenumber(PRINTERS_NAME);
745	const char *pname;
746
747	pcap_cache_reload();
748
749	/* remove stale printers */
750	for (snum = 0; snum < n_services; snum++) {
751		/* avoid removing PRINTERS_NAME or non-autoloaded printers */
752		if (snum == pnum || !(lp_snum_ok(snum) && lp_print_ok(snum) &&
753		                      lp_autoloaded(snum)))
754			continue;
755
756		pname = lp_printername(snum);
757		if (!pcap_printername_ok(pname)) {
758			DEBUG(3, ("removing stale printer %s\n", pname));
759
760			if (is_printer_published(NULL, snum, NULL))
761				nt_printer_publish(NULL, snum, DSPRINT_UNPUBLISH);
762			del_a_printer(pname);
763			lp_killservice(snum);
764		}
765	}
766
767	load_printers();
768}
769
770/****************************************************************************
771 Reload the services file.
772**************************************************************************/
773
774bool reload_services(bool test)
775{
776	bool ret;
777
778	if (lp_loaded()) {
779		char *fname = lp_configfile();
780		if (file_exist(fname) &&
781		    !strcsequal(fname, get_dyn_CONFIGFILE())) {
782			set_dyn_CONFIGFILE(fname);
783			test = False;
784		}
785	}
786
787	reopen_logs();
788
789	if (test && !lp_file_list_changed())
790		return(True);
791
792	lp_killunused(conn_snum_used);
793
794	ret = lp_load(get_dyn_CONFIGFILE(), False, False, True, True);
795
796	reload_printers();
797
798	/* perhaps the config filename is now set */
799	if (!test)
800		reload_services(True);
801
802	reopen_logs();
803
804	load_interfaces();
805
806	if (smbd_server_fd() != -1) {
807		set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
808		set_socket_options(smbd_server_fd(), lp_socket_options());
809	}
810
811	mangle_reset_cache();
812	reset_stat_cache();
813
814	/* this forces service parameters to be flushed */
815	set_current_service(NULL,0,True);
816
817	return(ret);
818}
819
820/****************************************************************************
821 Exit the server.
822****************************************************************************/
823
824/* Reasons for shutting down a server process. */
825enum server_exit_reason { SERVER_EXIT_NORMAL, SERVER_EXIT_ABNORMAL };
826
827static void exit_server_common(enum server_exit_reason how,
828	const char *const reason) _NORETURN_;
829
830static void exit_server_common(enum server_exit_reason how,
831	const char *const reason)
832{
833	bool had_open_conn = false;
834	struct smbd_server_connection *sconn = smbd_server_conn;
835
836	if (!exit_firsttime)
837		exit(0);
838	exit_firsttime = false;
839
840	change_to_root_user();
841
842	if (sconn && sconn->smb1.negprot.auth_context) {
843		struct auth_context *a = sconn->smb1.negprot.auth_context;
844		a->free(&sconn->smb1.negprot.auth_context);
845	}
846
847	if (sconn) {
848		had_open_conn = conn_close_all(sconn);
849		invalidate_all_vuids(sconn);
850	}
851
852	/* 3 second timeout. */
853	print_notify_send_messages(smbd_messaging_context(), 3);
854
855	/* delete our entry in the connections database. */
856	yield_connection(NULL,"");
857
858#ifdef WITH_DFS
859	if (dcelogin_atmost_once) {
860		dfs_unlogin();
861	}
862#endif
863
864#ifdef USE_DMAPI
865	/* Destroy Samba DMAPI session only if we are master smbd process */
866	if (am_parent) {
867		if (!dmapi_destroy_session()) {
868			DEBUG(0,("Unable to close Samba DMAPI session\n"));
869		}
870	}
871#endif
872
873	locking_end();
874	printing_end();
875
876	/*
877	 * we need to force the order of freeing the following,
878	 * because smbd_msg_ctx is not a talloc child of smbd_server_conn.
879	 */
880	sconn = NULL;
881	TALLOC_FREE(smbd_server_conn);
882	TALLOC_FREE(smbd_msg_ctx);
883	TALLOC_FREE(smbd_event_ctx);
884
885	if (how != SERVER_EXIT_NORMAL) {
886		int oldlevel = DEBUGLEVEL;
887
888		DEBUGLEVEL = 10;
889
890		DEBUGSEP(0);
891		DEBUG(0,("Abnormal server exit: %s\n",
892			reason ? reason : "no explanation provided"));
893		DEBUGSEP(0);
894
895		log_stack_trace();
896
897		DEBUGLEVEL = oldlevel;
898		dump_core();
899
900	} else {
901		DEBUG(3,("Server exit (%s)\n",
902			(reason ? reason : "normal exit")));
903		if (am_parent) {
904			pidfile_unlink();
905		}
906		gencache_stabilize();
907	}
908
909	/* if we had any open SMB connections when we exited then we
910	   need to tell the parent smbd so that it can trigger a retry
911	   of any locks we may have been holding or open files we were
912	   blocking */
913	if (had_open_conn) {
914		exit(1);
915	} else {
916		exit(0);
917	}
918}
919
920void exit_server(const char *const explanation)
921{
922	exit_server_common(SERVER_EXIT_ABNORMAL, explanation);
923}
924
925void exit_server_cleanly(const char *const explanation)
926{
927	exit_server_common(SERVER_EXIT_NORMAL, explanation);
928}
929
930void exit_server_fault(void)
931{
932	exit_server("critical server fault");
933}
934
935/****************************************************************************
936 Initialise connect, service and file structs.
937****************************************************************************/
938
939static bool init_structs(void )
940{
941	/*
942	 * Set the machine NETBIOS name if not already
943	 * set from the config file.
944	 */
945
946	if (!init_names())
947		return False;
948
949	file_init();
950
951	if (!secrets_init())
952		return False;
953
954	return True;
955}
956
957/****************************************************************************
958 main program.
959****************************************************************************/
960
961/* Declare prototype for build_options() to avoid having to run it through
962   mkproto.h.  Mixing $(builddir) and $(srcdir) source files in the current
963   prototype generation system is too complicated. */
964
965extern void build_options(bool screen);
966
967 int main(int argc,const char *argv[])
968{
969	/* shall I run as a daemon */
970	bool is_daemon = false;
971	bool interactive = false;
972	bool Fork = true;
973	bool no_process_group = false;
974	bool log_stdout = false;
975	char *ports = NULL;
976	char *profile_level = NULL;
977	int opt;
978	poptContext pc;
979	bool print_build_options = False;
980        enum {
981		OPT_DAEMON = 1000,
982		OPT_INTERACTIVE,
983		OPT_FORK,
984		OPT_NO_PROCESS_GROUP,
985		OPT_LOG_STDOUT
986	};
987	struct poptOption long_options[] = {
988	POPT_AUTOHELP
989	{"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" },
990	{"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"},
991	{"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" },
992	{"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
993	{"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
994	{"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
995	{"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
996	{"profiling-level", 'P', POPT_ARG_STRING, &profile_level, 0, "Set profiling level","PROFILE_LEVEL"},
997	POPT_COMMON_SAMBA
998	POPT_COMMON_DYNCONFIG
999	POPT_TABLEEND
1000	};
1001	struct smbd_parent_context *parent = NULL;
1002	TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
1003
1004	smbd_init_globals();
1005
1006	TimeInit();
1007
1008#ifdef HAVE_SET_AUTH_PARAMETERS
1009	set_auth_parameters(argc,argv);
1010#endif
1011
1012	pc = poptGetContext("smbd", argc, argv, long_options, 0);
1013	while((opt = poptGetNextOpt(pc)) != -1) {
1014		switch (opt)  {
1015		case OPT_DAEMON:
1016			is_daemon = true;
1017			break;
1018		case OPT_INTERACTIVE:
1019			interactive = true;
1020			break;
1021		case OPT_FORK:
1022			Fork = false;
1023			break;
1024		case OPT_NO_PROCESS_GROUP:
1025			no_process_group = true;
1026			break;
1027		case OPT_LOG_STDOUT:
1028			log_stdout = true;
1029			break;
1030		case 'b':
1031			print_build_options = True;
1032			break;
1033		default:
1034			d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
1035				  poptBadOption(pc, 0), poptStrerror(opt));
1036			poptPrintUsage(pc, stderr, 0);
1037			exit(1);
1038		}
1039	}
1040	poptFreeContext(pc);
1041
1042	if (interactive) {
1043		Fork = False;
1044		log_stdout = True;
1045	}
1046
1047	setup_logging(argv[0],log_stdout);
1048
1049	if (print_build_options) {
1050		build_options(True); /* Display output to screen as well as debug */
1051		exit(0);
1052	}
1053
1054	load_case_tables();
1055
1056#ifdef HAVE_SETLUID
1057	/* needed for SecureWare on SCO */
1058	setluid(0);
1059#endif
1060
1061	sec_init();
1062
1063	set_remote_machine_name("smbd", False);
1064
1065	if (interactive && (DEBUGLEVEL >= 9)) {
1066		talloc_enable_leak_report();
1067	}
1068
1069	if (log_stdout && Fork) {
1070		DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
1071		exit(1);
1072	}
1073
1074	/* we want to re-seed early to prevent time delays causing
1075           client problems at a later date. (tridge) */
1076	generate_random_buffer(NULL, 0);
1077
1078	/* make absolutely sure we run as root - to handle cases where people
1079	   are crazy enough to have it setuid */
1080
1081	gain_root_privilege();
1082	gain_root_group_privilege();
1083
1084	fault_setup((void (*)(void *))exit_server_fault);
1085	dump_core_setup("smbd");
1086
1087	/* we are never interested in SIGPIPE */
1088	BlockSignals(True,SIGPIPE);
1089
1090#if defined(SIGFPE)
1091	/* we are never interested in SIGFPE */
1092	BlockSignals(True,SIGFPE);
1093#endif
1094
1095#if defined(SIGUSR2)
1096	/* We are no longer interested in USR2 */
1097	BlockSignals(True,SIGUSR2);
1098#endif
1099
1100	/* POSIX demands that signals are inherited. If the invoking process has
1101	 * these signals masked, we will have problems, as we won't recieve them. */
1102	BlockSignals(False, SIGHUP);
1103	BlockSignals(False, SIGUSR1);
1104	BlockSignals(False, SIGTERM);
1105
1106	/* Ensure we leave no zombies until we
1107	 * correctly set up child handling below. */
1108
1109	CatchChild();
1110
1111	/* we want total control over the permissions on created files,
1112	   so set our umask to 0 */
1113	umask(0);
1114
1115	init_sec_ctx();
1116
1117	reopen_logs();
1118
1119	DEBUG(0,("smbd version %s started.\n", samba_version_string()));
1120	DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
1121
1122	DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
1123		 (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
1124
1125	/* Output the build options to the debug log */
1126	build_options(False);
1127
1128	if (sizeof(uint16) < 2 || sizeof(uint32) < 4) {
1129		DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
1130		exit(1);
1131	}
1132
1133	if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
1134		DEBUG(0, ("error opening config file\n"));
1135		exit(1);
1136	}
1137
1138	if (smbd_messaging_context() == NULL)
1139		exit(1);
1140
1141	if (!reload_services(False))
1142		return(-1);
1143
1144	init_structs();
1145
1146#ifdef WITH_PROFILE
1147	if (!profile_setup(smbd_messaging_context(), False)) {
1148		DEBUG(0,("ERROR: failed to setup profiling\n"));
1149		return -1;
1150	}
1151	if (profile_level != NULL) {
1152		int pl = atoi(profile_level);
1153		struct server_id src;
1154
1155		DEBUG(1, ("setting profiling level: %s\n",profile_level));
1156		src.pid = getpid();
1157		set_profile_level(pl, src);
1158	}
1159#endif
1160
1161	DEBUG(3,( "loaded services\n"));
1162
1163	if (!is_daemon && !is_a_socket(0)) {
1164		if (!interactive)
1165			DEBUG(0,("standard input is not a socket, assuming -D option\n"));
1166
1167		/*
1168		 * Setting is_daemon here prevents us from eventually calling
1169		 * the open_sockets_inetd()
1170		 */
1171
1172		is_daemon = True;
1173	}
1174
1175	if (is_daemon && !interactive) {
1176		DEBUG( 3, ( "Becoming a daemon.\n" ) );
1177		become_daemon(Fork, no_process_group);
1178	}
1179
1180#if HAVE_SETPGID
1181	/*
1182	 * If we're interactive we want to set our own process group for
1183	 * signal management.
1184	 */
1185	if (interactive && !no_process_group)
1186		setpgid( (pid_t)0, (pid_t)0);
1187#endif
1188
1189	if (!directory_exist(lp_lockdir()))
1190		mkdir(lp_lockdir(), 0755);
1191
1192	if (is_daemon)
1193		pidfile_create("smbd");
1194
1195	if (!NT_STATUS_IS_OK(reinit_after_fork(smbd_messaging_context(),
1196			     smbd_event_context(), false))) {
1197		DEBUG(0,("reinit_after_fork() failed\n"));
1198		exit(1);
1199	}
1200
1201	smbd_setup_sig_term_handler();
1202	smbd_setup_sig_hup_handler();
1203
1204	/* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1205
1206	if (smbd_memcache() == NULL) {
1207		exit(1);
1208	}
1209
1210	memcache_set_global(smbd_memcache());
1211
1212	/* Initialise the password backed before the global_sam_sid
1213	   to ensure that we fetch from ldap before we make a domain sid up */
1214
1215	if(!initialize_password_db(False, smbd_event_context()))
1216		exit(1);
1217
1218	if (!secrets_init()) {
1219		DEBUG(0, ("ERROR: smbd can not open secrets.tdb\n"));
1220		exit(1);
1221	}
1222
1223	if(!get_global_sam_sid()) {
1224		DEBUG(0,("ERROR: Samba cannot create a SAM SID.\n"));
1225		exit(1);
1226	}
1227
1228	if (!session_init())
1229		exit(1);
1230
1231	if (!connections_init(True))
1232		exit(1);
1233
1234	if (!locking_init())
1235		exit(1);
1236
1237	namecache_enable();
1238
1239	if (!W_ERROR_IS_OK(registry_init_full()))
1240		exit(1);
1241
1242#if 0
1243	if (!init_svcctl_db())
1244                exit(1);
1245#endif
1246
1247	if (!print_backend_init(smbd_messaging_context()))
1248		exit(1);
1249
1250	if (!init_guest_info()) {
1251		DEBUG(0,("ERROR: failed to setup guest info.\n"));
1252		return -1;
1253	}
1254
1255	/* Open the share_info.tdb here, so we don't have to open
1256	   after the fork on every single connection.  This is a small
1257	   performance improvment and reduces the total number of system
1258	   fds used. */
1259	if (!share_info_db_init()) {
1260		DEBUG(0,("ERROR: failed to load share info db.\n"));
1261		exit(1);
1262	}
1263
1264	/* only start the background queue daemon if we are
1265	   running as a daemon -- bad things will happen if
1266	   smbd is launched via inetd and we fork a copy of
1267	   ourselves here */
1268
1269	if (is_daemon && !interactive
1270	    && lp_parm_bool(-1, "smbd", "backgroundqueue", true)) {
1271		start_background_queue();
1272	}
1273
1274	if (!is_daemon) {
1275		/* inetd mode */
1276		TALLOC_FREE(frame);
1277
1278		/* Started from inetd. fd 0 is the socket. */
1279		/* We will abort gracefully when the client or remote system
1280		   goes away */
1281		smbd_set_server_fd(dup(0));
1282
1283		/* close our standard file descriptors */
1284		close_low_fds(False); /* Don't close stderr */
1285
1286#ifdef HAVE_ATEXIT
1287		atexit(killkids);
1288#endif
1289
1290	        /* Stop zombies */
1291		smbd_setup_sig_chld_handler();
1292
1293		smbd_process();
1294
1295		exit_server_cleanly(NULL);
1296		return(0);
1297	}
1298
1299	parent = talloc_zero(smbd_event_context(), struct smbd_parent_context);
1300	if (!parent) {
1301		exit_server("talloc(struct smbd_parent_context) failed");
1302	}
1303	parent->interactive = interactive;
1304
1305	if (!open_sockets_smbd(parent, ports))
1306		exit_server("open_sockets_smbd() failed");
1307
1308	TALLOC_FREE(frame);
1309	/* make sure we always have a valid stackframe */
1310	frame = talloc_stackframe();
1311
1312	smbd_parent_loop(parent);
1313
1314	exit_server_cleanly(NULL);
1315	TALLOC_FREE(frame);
1316	return(0);
1317}
1318