waf: Remove lib prefix from libraries manually.
[kai/samba.git] / source4 / smbd / server.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Main SMB server routines
5
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>
10    
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.
15    
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.
20    
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/>.
23 */
24
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 "libcli/auth/schannel.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"
44 #include "dynconfig/dynconfig.h"
45
46 /*
47   recursively delete a directory tree
48 */
49 static void recursive_delete(const char *path)
50 {
51         DIR *dir;
52         struct dirent *de;
53
54         dir = opendir(path);
55         if (!dir) {
56                 return;
57         }
58
59         for (de=readdir(dir);de;de=readdir(dir)) {
60                 char *fname;
61                 struct stat st;
62
63                 if (ISDOT(de->d_name) || ISDOTDOT(de->d_name)) {
64                         continue;
65                 }
66
67                 fname = talloc_asprintf(path, "%s/%s", path, de->d_name);
68                 if (stat(fname, &st) != 0) {
69                         continue;
70                 }
71                 if (S_ISDIR(st.st_mode)) {
72                         recursive_delete(fname);
73                         talloc_free(fname);
74                         continue;
75                 }
76                 if (unlink(fname) != 0) {
77                         DEBUG(0,("Unabled to delete '%s' - %s\n", 
78                                  fname, strerror(errno)));
79                         smb_panic("unable to cleanup tmp files");
80                 }
81                 talloc_free(fname);
82         }
83         closedir(dir);
84 }
85
86 /*
87   cleanup temporary files. This is the new alternative to
88   TDB_CLEAR_IF_FIRST. Unfortunately TDB_CLEAR_IF_FIRST is not
89   efficient on unix systems due to the lack of scaling of the byte
90   range locking system. So instead of putting the burden on tdb to
91   cleanup tmp files, this function deletes them. 
92 */
93 static void cleanup_tmp_files(struct loadparm_context *lp_ctx)
94 {
95         char *path;
96         TALLOC_CTX *mem_ctx = talloc_new(NULL);
97
98         path = smbd_tmp_path(mem_ctx, lp_ctx, NULL);
99
100         recursive_delete(path);
101         talloc_free(mem_ctx);
102 }
103
104 static void sig_hup(int sig)
105 {
106         debug_schedule_reopen_logs();
107 }
108
109 static void sig_term(int sig)
110 {
111 #if HAVE_GETPGRP
112         static int done_sigterm;
113         if (done_sigterm == 0 && getpgrp() == getpid()) {
114                 DEBUG(0,("SIGTERM: killing children\n"));
115                 done_sigterm = 1;
116                 kill(-getpgrp(), SIGTERM);
117         }
118 #endif
119         DEBUG(0,("Exiting pid %d on SIGTERM\n", (int)getpid()));
120         exit(127);
121 }
122
123 /*
124   setup signal masks
125 */
126 static void setup_signals(void)
127 {
128         /* we are never interested in SIGPIPE */
129         BlockSignals(true,SIGPIPE);
130
131 #if defined(SIGFPE)
132         /* we are never interested in SIGFPE */
133         BlockSignals(true,SIGFPE);
134 #endif
135
136         /* We are no longer interested in USR1 */
137         BlockSignals(true, SIGUSR1);
138
139 #if defined(SIGUSR2)
140         /* We are no longer interested in USR2 */
141         BlockSignals(true,SIGUSR2);
142 #endif
143
144         /* POSIX demands that signals are inherited. If the invoking process has
145          * these signals masked, we will have problems, as we won't receive them. */
146         BlockSignals(false, SIGHUP);
147         BlockSignals(false, SIGTERM);
148
149         CatchSignal(SIGHUP, sig_hup);
150         CatchSignal(SIGTERM, sig_term);
151 }
152
153 /*
154   handle io on stdin
155 */
156 static void server_stdin_handler(struct tevent_context *event_ctx, struct tevent_fd *fde, 
157                                  uint16_t flags, void *private_data)
158 {
159         const char *binary_name = (const char *)private_data;
160         uint8_t c;
161         if (read(0, &c, 1) == 0) {
162                 DEBUG(0,("%s: EOF on stdin - terminating\n", binary_name));
163 #if HAVE_GETPGRP
164                 if (getpgrp() == getpid()) {
165                         DEBUG(0,("Sending SIGTERM from pid %d\n", (int)getpid()));
166                         kill(-getpgrp(), SIGTERM);
167                 }
168 #endif
169                 exit(0);
170         }
171 }
172
173 /*
174   die if the user selected maximum runtime is exceeded
175 */
176 _NORETURN_ static void max_runtime_handler(struct tevent_context *ev, 
177                                            struct tevent_timer *te, 
178                                            struct timeval t, void *private_data)
179 {
180         const char *binary_name = (const char *)private_data;
181         DEBUG(0,("%s: maximum runtime exceeded - terminating\n", binary_name));
182         exit(0);
183 }
184
185 /*
186   pre-open the key databases. This saves a lot of time in child
187   processes
188  */
189 static void prime_ldb_databases(struct tevent_context *event_ctx)
190 {
191         TALLOC_CTX *db_context;
192         db_context = talloc_new(event_ctx);
193
194         samdb_connect(db_context, event_ctx, cmdline_lp_ctx, system_session(cmdline_lp_ctx), 0);
195         privilege_connect(db_context, event_ctx, cmdline_lp_ctx);
196
197         /* we deliberately leave these open, which allows them to be
198          * re-used in ldb_wrap_connect() */
199 }
200
201
202 /*
203   called when a fatal condition occurs in a child task
204  */
205 static NTSTATUS samba_terminate(struct irpc_message *msg, 
206                                 struct samba_terminate *r)
207 {
208         DEBUG(0,("samba_terminate: %s\n", r->in.reason));
209         exit(1);
210 }
211
212 /*
213   setup messaging for the top level samba (parent) task
214  */
215 static NTSTATUS setup_parent_messaging(struct tevent_context *event_ctx, 
216                                        struct loadparm_context *lp_ctx)
217 {
218         struct messaging_context *msg;
219         NTSTATUS status;
220
221         msg = messaging_init(talloc_autofree_context(), 
222                              lpcfg_messaging_path(event_ctx, lp_ctx),
223                              cluster_id(0, SAMBA_PARENT_TASKID), event_ctx);
224         NT_STATUS_HAVE_NO_MEMORY(msg);
225
226         irpc_add_name(msg, "samba");
227
228         status = IRPC_REGISTER(msg, irpc, SAMBA_TERMINATE,
229                                samba_terminate, NULL);
230
231         return status;
232 }
233
234
235 /*
236   show build info
237  */
238 static void show_build(void)
239 {
240 #define CONFIG_OPTION(n) { #n, dyn_ ## n }
241         struct {
242                 const char *name;
243                 const char *value;
244         } config_options[] = {
245                 CONFIG_OPTION(BINDIR),
246                 CONFIG_OPTION(SBINDIR),
247                 CONFIG_OPTION(CONFIGFILE),
248                 CONFIG_OPTION(NCALRPCDIR),
249                 CONFIG_OPTION(LOGFILEBASE),
250                 CONFIG_OPTION(LMHOSTSFILE),
251                 CONFIG_OPTION(DATADIR),
252                 CONFIG_OPTION(MODULESDIR),
253                 CONFIG_OPTION(LOCKDIR),
254                 CONFIG_OPTION(PIDDIR),
255                 CONFIG_OPTION(PRIVATE_DIR),
256                 CONFIG_OPTION(SWATDIR),
257                 CONFIG_OPTION(SETUPDIR),
258                 CONFIG_OPTION(WINBINDD_SOCKET_DIR),
259                 CONFIG_OPTION(WINBINDD_PRIVILEGED_SOCKET_DIR),
260                 CONFIG_OPTION(NTP_SIGND_SOCKET_DIR),
261                 { NULL, NULL}
262         };
263         int i;
264
265         printf("Samba version: %s\n", SAMBA_VERSION_STRING);
266         printf("Build environment:\n");
267 #ifdef BUILD_SYSTEM
268         printf("   Build host:  %s\n", BUILD_SYSTEM);
269 #endif
270
271         printf("Paths:\n");
272         for (i=0; config_options[i].name; i++) {
273                 printf("   %s: %s\n", config_options[i].name, config_options[i].value);
274         }
275
276         exit(0);
277 }
278
279 /*
280  main server.
281 */
282 static int binary_smbd_main(const char *binary_name, int argc, const char *argv[])
283 {
284         bool opt_daemon = false;
285         bool opt_interactive = false;
286         int opt;
287         poptContext pc;
288         extern NTSTATUS server_service_wrepl_init(void);
289         extern NTSTATUS server_service_kdc_init(void);
290         extern NTSTATUS server_service_ldap_init(void);
291         extern NTSTATUS server_service_web_init(void);
292         extern NTSTATUS server_service_ldap_init(void);
293         extern NTSTATUS server_service_winbind_init(void);
294         extern NTSTATUS server_service_nbtd_init(void);
295         extern NTSTATUS server_service_auth_init(void);
296         extern NTSTATUS server_service_cldapd_init(void);
297         extern NTSTATUS server_service_smb_init(void);
298         extern NTSTATUS server_service_drepl_init(void);
299         extern NTSTATUS server_service_kcc_init(void);
300         extern NTSTATUS server_service_dnsupdate_init(void);
301         extern NTSTATUS server_service_dns_init(void);
302         extern NTSTATUS server_service_rpc_init(void);
303         extern NTSTATUS server_service_ntp_signd_init(void);
304         extern NTSTATUS server_service_samba3_smb_init(void);
305         init_module_fn static_init[] = { STATIC_service_MODULES };
306         init_module_fn *shared_init;
307         struct tevent_context *event_ctx;
308         uint16_t stdin_event_flags;
309         NTSTATUS status;
310         const char *model = "standard";
311         int max_runtime = 0;
312         enum {
313                 OPT_DAEMON = 1000,
314                 OPT_INTERACTIVE,
315                 OPT_PROCESS_MODEL,
316                 OPT_SHOW_BUILD
317         };
318         struct poptOption long_options[] = {
319                 POPT_AUTOHELP
320                 {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON,
321                  "Become a daemon (default)", NULL },
322                 {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE,
323                  "Run interactive (not a daemon)", NULL},
324                 {"model", 'M', POPT_ARG_STRING, NULL, OPT_PROCESS_MODEL, 
325                  "Select process model", "MODEL"},
326                 {"maximum-runtime",0, POPT_ARG_INT, &max_runtime, 0, 
327                  "set maximum runtime of the server process, till autotermination", "seconds"},
328                 {"show-build", 'b', POPT_ARG_NONE, NULL, OPT_SHOW_BUILD, "show build info", NULL },
329                 POPT_COMMON_SAMBA
330                 POPT_COMMON_VERSION
331                 { NULL }
332         };
333
334         pc = poptGetContext(binary_name, argc, argv, long_options, 0);
335         while((opt = poptGetNextOpt(pc)) != -1) {
336                 switch(opt) {
337                 case OPT_DAEMON:
338                         opt_daemon = true;
339                         break;
340                 case OPT_INTERACTIVE:
341                         opt_interactive = true;
342                         break;
343                 case OPT_PROCESS_MODEL:
344                         model = poptGetOptArg(pc);
345                         break;
346                 case OPT_SHOW_BUILD:
347                         show_build();
348                         break;
349                 default:
350                         fprintf(stderr, "\nInvalid option %s: %s\n\n",
351                                   poptBadOption(pc, 0), poptStrerror(opt));
352                         poptPrintUsage(pc, stderr, 0);
353                         return 1;
354                 }
355         }
356
357         if (opt_daemon && opt_interactive) {
358                 fprintf(stderr,"\nERROR: "
359                           "Option -i|--interactive is not allowed together with -D|--daemon\n\n");
360                 poptPrintUsage(pc, stderr, 0);
361                 return 1;
362         } else if (!opt_interactive) {
363                 /* default is --daemon */
364                 opt_daemon = true;
365         }
366
367         poptFreeContext(pc);
368
369         setup_logging(binary_name, opt_interactive?DEBUG_STDOUT:DEBUG_FILE);
370         setup_signals();
371
372         /* we want total control over the permissions on created files,
373            so set our umask to 0 */
374         umask(0);
375
376         DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
377         DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2010\n"));
378
379         if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
380                 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
381                 DEBUGADD(0,("sizeof(uint16_t) = %u, sizeof(uint32_t) %u, sizeof(uint64_t) = %u\n",
382                             (unsigned int)sizeof(uint16_t), (unsigned int)sizeof(uint32_t), (unsigned int)sizeof(uint64_t)));
383                 return 1;
384         }
385
386         if (opt_daemon) {
387                 DEBUG(3,("Becoming a daemon.\n"));
388                 become_daemon(true, false, false);
389         }
390
391         cleanup_tmp_files(cmdline_lp_ctx);
392
393         if (!directory_exist(lpcfg_lockdir(cmdline_lp_ctx))) {
394                 mkdir(lpcfg_lockdir(cmdline_lp_ctx), 0755);
395         }
396
397         pidfile_create(lpcfg_piddir(cmdline_lp_ctx), binary_name);
398
399         /* Do *not* remove this, until you have removed
400          * passdb/secrets.c, and proved that Samba still builds... */
401         /* Setup the SECRETS subsystem */
402         if (secrets_init(talloc_autofree_context(), cmdline_lp_ctx) == NULL) {
403                 return 1;
404         }
405
406         if (lpcfg_server_role(cmdline_lp_ctx) == ROLE_DOMAIN_CONTROLLER) {
407                 if (!open_schannel_session_store(talloc_autofree_context(), lpcfg_private_dir(cmdline_lp_ctx))) {
408                         DEBUG(0,("ERROR: Samba cannot open schannel store for secured NETLOGON operations.\n"));
409                         exit(1);
410                 }
411         }
412
413         gensec_init(cmdline_lp_ctx); /* FIXME: */
414
415         ntptr_init(cmdline_lp_ctx);     /* FIXME: maybe run this in the initialization function 
416                                                 of the spoolss RPC server instead? */
417
418         ntvfs_init(cmdline_lp_ctx);     /* FIXME: maybe run this in the initialization functions 
419                                                 of the SMB[,2] server instead? */
420
421         process_model_init(cmdline_lp_ctx); 
422
423         shared_init = load_samba_modules(NULL, cmdline_lp_ctx, "service");
424
425         run_init_functions(static_init);
426         run_init_functions(shared_init);
427
428         talloc_free(shared_init);
429         
430         /* the event context is the top level structure in smbd. Everything else
431            should hang off that */
432         event_ctx = s4_event_context_init(talloc_autofree_context());
433
434         if (event_ctx == NULL) {
435                 DEBUG(0,("Initializing event context failed\n"));
436                 return 1;
437         }
438
439         if (opt_interactive) {
440                 /* terminate when stdin goes away */
441                 stdin_event_flags = TEVENT_FD_READ;
442         } else {
443                 /* stay alive forever */
444                 stdin_event_flags = 0;
445         }
446
447         /* catch EOF on stdin */
448 #ifdef SIGTTIN
449         signal(SIGTTIN, SIG_IGN);
450 #endif
451         tevent_add_fd(event_ctx, event_ctx, 0, stdin_event_flags,
452                       server_stdin_handler,
453                       discard_const(binary_name));
454
455         if (max_runtime) {
456                 tevent_add_timer(event_ctx, event_ctx,
457                                  timeval_current_ofs(max_runtime, 0),
458                                  max_runtime_handler,
459                                  discard_const(binary_name));
460         }
461
462         prime_ldb_databases(event_ctx);
463
464         status = setup_parent_messaging(event_ctx, cmdline_lp_ctx);
465         if (!NT_STATUS_IS_OK(status)) {
466                 DEBUG(0,("Failed to setup parent messaging - %s\n", nt_errstr(status)));
467                 return 1;
468         }
469
470         DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
471
472         status = server_service_startup(event_ctx, cmdline_lp_ctx, model, 
473                                         lpcfg_server_services(cmdline_lp_ctx));
474         if (!NT_STATUS_IS_OK(status)) {
475                 DEBUG(0,("Starting Services failed - %s\n", nt_errstr(status)));
476                 return 1;
477         }
478
479         /* wait for events - this is where smbd sits for most of its
480            life */
481         tevent_loop_wait(event_ctx);
482
483         /* as everything hangs off this event context, freeing it
484            should initiate a clean shutdown of all services */
485         talloc_free(event_ctx);
486
487         return 0;
488 }
489
490 int main(int argc, const char *argv[])
491 {
492         return binary_smbd_main("samba", argc, argv);
493 }