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