s4: load the domain level of the current provision and create a provision with the...
[Samba/cd1.git] / source4 / smbd / server.c
blobddfa220a729e8a7d43afd35cb48e9a9e6b8b6dd8
1 /*
2 Unix SMB/CIFS implementation.
4 Main SMB server routines
6 Copyright (C) Andrew Tridgell 1992-2005
7 Copyright (C) Martin Pool 2002
8 Copyright (C) Jelmer Vernooij 2002
9 Copyright (C) James J Myers 2003 <myersjj@samba.org>
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "includes.h"
26 #include "lib/events/events.h"
27 #include "version.h"
28 #include "lib/cmdline/popt_common.h"
29 #include "system/dir.h"
30 #include "system/filesys.h"
31 #include "ntvfs/ntvfs.h"
32 #include "ntptr/ntptr.h"
33 #include "auth/gensec/gensec.h"
34 #include "auth/gensec/schannel_state.h"
35 #include "smbd/process_model.h"
36 #include "param/secrets.h"
37 #include "smbd/pidfile.h"
38 #include "param/param.h"
39 #include "dsdb/samdb/samdb.h"
40 #include "auth/session.h"
41 #include "lib/messaging/irpc.h"
42 #include "librpc/gen_ndr/ndr_irpc.h"
43 #include "cluster/cluster.h"
46 recursively delete a directory tree
48 static void recursive_delete(const char *path)
50 DIR *dir;
51 struct dirent *de;
53 dir = opendir(path);
54 if (!dir) {
55 return;
58 for (de=readdir(dir);de;de=readdir(dir)) {
59 char *fname;
60 struct stat st;
62 if (ISDOT(de->d_name) || ISDOTDOT(de->d_name)) {
63 continue;
66 fname = talloc_asprintf(path, "%s/%s", path, de->d_name);
67 if (stat(fname, &st) != 0) {
68 continue;
70 if (S_ISDIR(st.st_mode)) {
71 recursive_delete(fname);
72 talloc_free(fname);
73 continue;
75 if (unlink(fname) != 0) {
76 DEBUG(0,("Unabled to delete '%s' - %s\n",
77 fname, strerror(errno)));
78 smb_panic("unable to cleanup tmp files");
80 talloc_free(fname);
82 closedir(dir);
86 cleanup temporary files. This is the new alternative to
87 TDB_CLEAR_IF_FIRST. Unfortunately TDB_CLEAR_IF_FIRST is not
88 efficient on unix systems due to the lack of scaling of the byte
89 range locking system. So instead of putting the burden on tdb to
90 cleanup tmp files, this function deletes them.
92 static void cleanup_tmp_files(struct loadparm_context *lp_ctx)
94 char *path;
95 TALLOC_CTX *mem_ctx = talloc_new(NULL);
97 path = smbd_tmp_path(mem_ctx, lp_ctx, NULL);
99 recursive_delete(path);
100 talloc_free(mem_ctx);
103 static void sig_hup(int sig)
105 debug_schedule_reopen_logs();
108 static void sig_term(int sig)
110 #if HAVE_GETPGRP
111 static int done_sigterm;
112 if (done_sigterm == 0 && getpgrp() == getpid()) {
113 DEBUG(0,("SIGTERM: killing children\n"));
114 done_sigterm = 1;
115 kill(-getpgrp(), SIGTERM);
117 #endif
118 DEBUG(0,("Exiting pid %d on SIGTERM\n", (int)getpid()));
119 exit(0);
123 setup signal masks
125 static void setup_signals(void)
127 /* we are never interested in SIGPIPE */
128 BlockSignals(true,SIGPIPE);
130 #if defined(SIGFPE)
131 /* we are never interested in SIGFPE */
132 BlockSignals(true,SIGFPE);
133 #endif
135 /* We are no longer interested in USR1 */
136 BlockSignals(true, SIGUSR1);
138 #if defined(SIGUSR2)
139 /* We are no longer interested in USR2 */
140 BlockSignals(true,SIGUSR2);
141 #endif
143 /* POSIX demands that signals are inherited. If the invoking process has
144 * these signals masked, we will have problems, as we won't recieve them. */
145 BlockSignals(false, SIGHUP);
146 BlockSignals(false, SIGTERM);
148 CatchSignal(SIGHUP, sig_hup);
149 CatchSignal(SIGTERM, sig_term);
153 handle io on stdin
155 static void server_stdin_handler(struct tevent_context *event_ctx, struct tevent_fd *fde,
156 uint16_t flags, void *private_data)
158 const char *binary_name = (const char *)private_data;
159 uint8_t c;
160 if (read(0, &c, 1) == 0) {
161 DEBUG(0,("%s: EOF on stdin - terminating\n", binary_name));
162 #if HAVE_GETPGRP
163 if (getpgrp() == getpid()) {
164 DEBUG(0,("Sending SIGTERM from pid %d\n", (int)getpid()));
165 kill(-getpgrp(), SIGTERM);
167 #endif
168 exit(0);
173 die if the user selected maximum runtime is exceeded
175 _NORETURN_ static void max_runtime_handler(struct tevent_context *ev,
176 struct tevent_timer *te,
177 struct timeval t, void *private_data)
179 const char *binary_name = (const char *)private_data;
180 DEBUG(0,("%s: maximum runtime exceeded - terminating\n", binary_name));
181 exit(0);
185 pre-open the key databases. This saves a lot of time in child
186 processes
188 static void prime_ldb_databases(struct tevent_context *event_ctx)
190 TALLOC_CTX *db_context;
191 db_context = talloc_new(event_ctx);
193 samdb_connect(db_context, event_ctx, cmdline_lp_ctx, system_session(cmdline_lp_ctx));
194 privilege_connect(db_context, event_ctx, cmdline_lp_ctx);
195 schannel_db_connect(db_context, event_ctx, cmdline_lp_ctx);
197 /* we deliberately leave these open, which allows them to be
198 * re-used in ldb_wrap_connect() */
203 called when a fatal condition occurs in a child task
205 static NTSTATUS samba_terminate(struct irpc_message *msg,
206 struct samba_terminate *r)
208 DEBUG(0,("samba_terminate: %s\n", r->in.reason));
209 exit(1);
213 setup messaging for the top level samba (parent) task
215 static NTSTATUS setup_parent_messaging(struct tevent_context *event_ctx,
216 struct loadparm_context *lp_ctx)
218 struct messaging_context *msg;
219 NTSTATUS status;
221 msg = messaging_init(talloc_autofree_context(),
222 lp_messaging_path(event_ctx, lp_ctx),
223 cluster_id(0, SAMBA_PARENT_TASKID),
224 lp_iconv_convenience(lp_ctx),
225 event_ctx);
226 NT_STATUS_HAVE_NO_MEMORY(msg);
228 irpc_add_name(msg, "samba");
230 status = IRPC_REGISTER(msg, irpc, SAMBA_TERMINATE,
231 samba_terminate, NULL);
233 return status;
239 main server.
241 static int binary_smbd_main(const char *binary_name, int argc, const char *argv[])
243 bool opt_daemon = false;
244 bool opt_interactive = false;
245 int opt;
246 poptContext pc;
247 extern NTSTATUS server_service_wrepl_init(void);
248 extern NTSTATUS server_service_kdc_init(void);
249 extern NTSTATUS server_service_ldap_init(void);
250 extern NTSTATUS server_service_web_init(void);
251 extern NTSTATUS server_service_ldap_init(void);
252 extern NTSTATUS server_service_winbind_init(void);
253 extern NTSTATUS server_service_nbtd_init(void);
254 extern NTSTATUS server_service_auth_init(void);
255 extern NTSTATUS server_service_cldapd_init(void);
256 extern NTSTATUS server_service_smb_init(void);
257 extern NTSTATUS server_service_drepl_init(void);
258 extern NTSTATUS server_service_kcc_init(void);
259 extern NTSTATUS server_service_rpc_init(void);
260 extern NTSTATUS server_service_ntp_signd_init(void);
261 extern NTSTATUS server_service_samba3_smb_init(void);
262 init_module_fn static_init[] = { STATIC_service_MODULES };
263 init_module_fn *shared_init;
264 struct tevent_context *event_ctx;
265 uint16_t stdin_event_flags;
266 NTSTATUS status;
267 const char *model = "standard";
268 int max_runtime = 0;
269 enum {
270 OPT_DAEMON = 1000,
271 OPT_INTERACTIVE,
272 OPT_PROCESS_MODEL
274 struct poptOption long_options[] = {
275 POPT_AUTOHELP
276 {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON,
277 "Become a daemon (default)", NULL },
278 {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE,
279 "Run interactive (not a daemon)", NULL},
280 {"model", 'M', POPT_ARG_STRING, NULL, OPT_PROCESS_MODEL,
281 "Select process model", "MODEL"},
282 {"maximum-runtime",0, POPT_ARG_INT, &max_runtime, 0,
283 "set maximum runtime of the server process, till autotermination", "seconds"},
284 POPT_COMMON_SAMBA
285 POPT_COMMON_VERSION
286 { NULL }
289 pc = poptGetContext(binary_name, argc, argv, long_options, 0);
290 while((opt = poptGetNextOpt(pc)) != -1) {
291 switch(opt) {
292 case OPT_DAEMON:
293 opt_daemon = true;
294 break;
295 case OPT_INTERACTIVE:
296 opt_interactive = true;
297 break;
298 case OPT_PROCESS_MODEL:
299 model = poptGetOptArg(pc);
300 break;
301 default:
302 fprintf(stderr, "\nInvalid option %s: %s\n\n",
303 poptBadOption(pc, 0), poptStrerror(opt));
304 poptPrintUsage(pc, stderr, 0);
305 exit(1);
309 if (opt_daemon && opt_interactive) {
310 fprintf(stderr,"\nERROR: "
311 "Option -i|--interactive is not allowed together with -D|--daemon\n\n");
312 poptPrintUsage(pc, stderr, 0);
313 exit(1);
314 } else if (!opt_interactive) {
315 /* default is --daemon */
316 opt_daemon = true;
319 poptFreeContext(pc);
321 setup_logging(binary_name, opt_interactive?DEBUG_STDOUT:DEBUG_FILE);
322 setup_signals();
324 /* we want total control over the permissions on created files,
325 so set our umask to 0 */
326 umask(0);
328 DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
329 DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2009\n"));
331 if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
332 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
333 DEBUGADD(0,("sizeof(uint16_t) = %u, sizeof(uint32_t) %u, sizeof(uint64_t) = %u\n",
334 (unsigned int)sizeof(uint16_t), (unsigned int)sizeof(uint32_t), (unsigned int)sizeof(uint64_t)));
335 exit(1);
338 if (opt_daemon) {
339 DEBUG(3,("Becoming a daemon.\n"));
340 become_daemon(true, false);
343 cleanup_tmp_files(cmdline_lp_ctx);
345 if (!directory_exist(lp_lockdir(cmdline_lp_ctx))) {
346 mkdir(lp_lockdir(cmdline_lp_ctx), 0755);
349 pidfile_create(lp_piddir(cmdline_lp_ctx), binary_name);
351 /* Do *not* remove this, until you have removed
352 * passdb/secrets.c, and proved that Samba still builds... */
353 /* Setup the SECRETS subsystem */
354 if (secrets_init(talloc_autofree_context(), cmdline_lp_ctx) == NULL) {
355 exit(1);
358 gensec_init(cmdline_lp_ctx); /* FIXME: */
360 ntptr_init(cmdline_lp_ctx); /* FIXME: maybe run this in the initialization function
361 of the spoolss RPC server instead? */
363 ntvfs_init(cmdline_lp_ctx); /* FIXME: maybe run this in the initialization functions
364 of the SMB[,2] server instead? */
366 process_model_init(cmdline_lp_ctx);
368 shared_init = load_samba_modules(NULL, cmdline_lp_ctx, "service");
370 run_init_functions(static_init);
371 run_init_functions(shared_init);
373 talloc_free(shared_init);
375 /* the event context is the top level structure in smbd. Everything else
376 should hang off that */
377 event_ctx = s4_event_context_init(talloc_autofree_context());
379 if (event_ctx == NULL) {
380 DEBUG(0,("Initializing event context failed\n"));
381 return 1;
384 if (opt_interactive) {
385 /* terminate when stdin goes away */
386 stdin_event_flags = TEVENT_FD_READ;
387 } else {
388 /* stay alive forever */
389 stdin_event_flags = 0;
392 /* catch EOF on stdin */
393 #ifdef SIGTTIN
394 signal(SIGTTIN, SIG_IGN);
395 #endif
396 tevent_add_fd(event_ctx, event_ctx, 0, stdin_event_flags,
397 server_stdin_handler,
398 discard_const(binary_name));
400 if (max_runtime) {
401 tevent_add_timer(event_ctx, event_ctx,
402 timeval_current_ofs(max_runtime, 0),
403 max_runtime_handler,
404 discard_const(binary_name));
407 prime_ldb_databases(event_ctx);
409 status = setup_parent_messaging(event_ctx, cmdline_lp_ctx);
410 if (!NT_STATUS_IS_OK(status)) {
411 DEBUG(0,("Failed to setup parent messaging - %s\n", nt_errstr(status)));
412 return 1;
415 DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
417 status = server_service_startup(event_ctx, cmdline_lp_ctx, model,
418 lp_server_services(cmdline_lp_ctx));
419 if (!NT_STATUS_IS_OK(status)) {
420 DEBUG(0,("Starting Services failed - %s\n", nt_errstr(status)));
421 return 1;
424 /* wait for events - this is where smbd sits for most of its
425 life */
426 tevent_loop_wait(event_ctx);
428 /* as everything hangs off this event context, freeing it
429 should initiate a clean shutdown of all services */
430 talloc_free(event_ctx);
432 return 0;
435 int main(int argc, const char *argv[])
437 return binary_smbd_main("samba", argc, argv);