r25026: Move param/param.h out of includes.h
[tprouty/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 "build.h"
32 #include "ldb/include/ldb.h"
33 #include "registry/registry.h"
34 #include "ntvfs/ntvfs.h"
35 #include "ntptr/ntptr.h"
36 #include "auth/gensec/gensec.h"
37 #include "smbd/process_model.h"
38 #include "smbd/service.h"
39 #include "param/secrets.h"
40 #include "smbd/pidfile.h"
41 #include "cluster/ctdb/ctdb_cluster.h"
42 #include "param/param.h"
43
44 /*
45   recursively delete a directory tree
46 */
47 static void recursive_delete(const char *path)
48 {
49         DIR *dir;
50         struct dirent *de;
51
52         dir = opendir(path);
53         if (!dir) {
54                 return;
55         }
56
57         for (de=readdir(dir);de;de=readdir(dir)) {
58                 char *fname;
59                 struct stat st;
60
61                 if (ISDOT(de->d_name) || ISDOTDOT(de->d_name)) {
62                         continue;
63                 }
64
65                 fname = talloc_asprintf(path, "%s/%s", path, de->d_name);
66                 if (stat(fname, &st) != 0) {
67                         continue;
68                 }
69                 if (S_ISDIR(st.st_mode)) {
70                         recursive_delete(fname);
71                         talloc_free(fname);
72                         continue;
73                 }
74                 if (unlink(fname) != 0) {
75                         DEBUG(0,("Unabled to delete '%s' - %s\n", 
76                                  fname, strerror(errno)));
77                         smb_panic("unable to cleanup tmp files");
78                 }
79                 talloc_free(fname);
80         }
81         closedir(dir);
82 }
83
84 /*
85   cleanup temporary files. This is the new alternative to
86   TDB_CLEAR_IF_FIRST. Unfortunately TDB_CLEAR_IF_FIRST is not
87   efficient on unix systems due to the lack of scaling of the byte
88   range locking system. So instead of putting the burden on tdb to
89   cleanup tmp files, this function deletes them. 
90 */
91 static void cleanup_tmp_files(void)
92 {
93         char *path;
94         TALLOC_CTX *mem_ctx = talloc_new(NULL);
95
96         path = smbd_tmp_path(mem_ctx, NULL);
97
98         recursive_delete(path);
99         talloc_free(mem_ctx);
100 }
101
102 static void sig_hup(int sig)
103 {
104         debug_schedule_reopen_logs();
105 }
106
107 static void sig_term(int sig)
108 {
109 #if HAVE_GETPGRP
110         static int done_sigterm;
111         if (done_sigterm == 0 && getpgrp() == getpid()) {
112                 DEBUG(0,("SIGTERM: killing children\n"));
113                 done_sigterm = 1;
114                 kill(-getpgrp(), SIGTERM);
115         }
116 #endif
117         exit(0);
118 }
119
120 /*
121   setup signal masks
122 */
123 static void setup_signals(void)
124 {
125         /* we are never interested in SIGPIPE */
126         BlockSignals(True,SIGPIPE);
127
128 #if defined(SIGFPE)
129         /* we are never interested in SIGFPE */
130         BlockSignals(True,SIGFPE);
131 #endif
132
133         /* We are no longer interested in USR1 */
134         BlockSignals(True, SIGUSR1);
135
136 #if defined(SIGUSR2)
137         /* We are no longer interested in USR2 */
138         BlockSignals(True,SIGUSR2);
139 #endif
140
141         /* POSIX demands that signals are inherited. If the invoking process has
142          * these signals masked, we will have problems, as we won't recieve them. */
143         BlockSignals(False, SIGHUP);
144         BlockSignals(False, SIGTERM);
145
146         CatchSignal(SIGHUP, sig_hup);
147         CatchSignal(SIGTERM, sig_term);
148 }
149
150 /*
151   handle io on stdin
152 */
153 static void server_stdin_handler(struct event_context *event_ctx, struct fd_event *fde, 
154                                  uint16_t flags, void *private)
155 {
156         const char *binary_name = private;
157         uint8_t c;
158         if (read(0, &c, 1) == 0) {
159                 DEBUG(0,("%s: EOF on stdin - terminating\n", binary_name));
160 #if HAVE_GETPGRP
161                 if (getpgrp() == getpid()) {
162                         kill(-getpgrp(), SIGTERM);
163                 }
164 #endif
165                 exit(0);
166         }
167 }
168
169 /*
170   die if the user selected maximum runtime is exceeded
171 */
172 _NORETURN_ static void max_runtime_handler(struct event_context *ev, struct timed_event *te, 
173                                 struct timeval t, void *private)
174 {
175         const char *binary_name = private;
176         DEBUG(0,("%s: maximum runtime exceeded - terminating\n", binary_name));
177         exit(0);
178 }
179
180 /*
181  main server.
182 */
183 static int binary_smbd_main(const char *binary_name, int argc, const char *argv[])
184 {
185         bool opt_daemon = false;
186         bool opt_interactive = false;
187         int opt;
188         poptContext pc;
189         init_module_fn static_init[] = STATIC_service_MODULES;
190         init_module_fn *shared_init;
191         struct event_context *event_ctx;
192         NTSTATUS status;
193         const char *model = "standard";
194         int max_runtime = 0;
195         enum {
196                 OPT_DAEMON = 1000,
197                 OPT_INTERACTIVE,
198                 OPT_PROCESS_MODEL
199         };
200         struct poptOption long_options[] = {
201                 POPT_AUTOHELP
202                 {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON,
203                  "Become a daemon (default)", NULL },
204                 {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE,
205                  "Run interactive (not a daemon)", NULL},
206                 {"model", 'M', POPT_ARG_STRING, NULL, OPT_PROCESS_MODEL, 
207                  "Select process model", "MODEL"},
208                 {"maximum-runtime",0, POPT_ARG_INT, &max_runtime, 0, 
209                  "set maximum runtime of the server process, till autotermination", "seconds"},
210                 POPT_COMMON_SAMBA
211                 POPT_COMMON_VERSION
212                 { NULL }
213         };
214
215         pc = poptGetContext(binary_name, argc, argv, long_options, 0);
216         while((opt = poptGetNextOpt(pc)) != -1) {
217                 switch(opt) {
218                 case OPT_DAEMON:
219                         opt_daemon = true;
220                         break;
221                 case OPT_INTERACTIVE:
222                         opt_interactive = true;
223                         break;
224                 case OPT_PROCESS_MODEL:
225                         model = poptGetOptArg(pc);
226                         break;
227                 default:
228                         d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
229                                   poptBadOption(pc, 0), poptStrerror(opt));
230                         poptPrintUsage(pc, stderr, 0);
231                         exit(1);
232                 }
233         }
234
235         if (opt_daemon && opt_interactive) {
236                 d_fprintf(stderr,"\nERROR: "
237                           "Option -i|--interactive is not allowed together with -D|--daemon\n\n");
238                 poptPrintUsage(pc, stderr, 0);
239                 exit(1);
240         } else if (!opt_interactive) {
241                 /* default is --daemon */
242                 opt_daemon = true;
243         }
244
245         poptFreeContext(pc);
246
247         setup_logging(binary_name, opt_interactive?DEBUG_STDOUT:DEBUG_FILE);
248         setup_signals();
249
250         /* we want total control over the permissions on created files,
251            so set our umask to 0 */
252         umask(0);
253
254         DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
255         DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2007\n"));
256
257         if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
258                 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
259                 DEBUGADD(0,("sizeof(uint16_t) = %u, sizeof(uint32_t) %u, sizeof(uint64_t) = %u\n",
260                             (unsigned int)sizeof(uint16_t), (unsigned int)sizeof(uint32_t), (unsigned int)sizeof(uint64_t)));
261                 exit(1);
262         }
263
264         if (opt_daemon) {
265                 DEBUG(3,("Becoming a daemon.\n"));
266                 become_daemon(true);
267         }
268
269         cleanup_tmp_files();
270
271         if (!directory_exist(lp_lockdir())) {
272                 mkdir(lp_lockdir(), 0755);
273         }
274
275         pidfile_create(binary_name);
276
277         /* Do *not* remove this, until you have removed
278          * passdb/secrets.c, and proved that Samba still builds... */
279         /* Setup the SECRETS subsystem */
280         if (!secrets_init()) {
281                 exit(1);
282         }
283
284         ldb_global_init(); /* FIXME: */
285
286         share_init();
287
288         gensec_init(); /* FIXME: */
289
290         ntptr_init();   /* FIXME: maybe run this in the initialization function 
291                                                 of the spoolss RPC server instead? */
292
293         ntvfs_init();   /* FIXME: maybe run this in the initialization functions 
294                                                 of the SMB[,2] server instead? */
295
296         process_model_init(); 
297
298         shared_init = load_samba_modules(NULL, "service");
299
300         run_init_functions(static_init);
301         run_init_functions(shared_init);
302
303         talloc_free(shared_init);
304         
305         /* the event context is the top level structure in smbd. Everything else
306            should hang off that */
307         event_ctx = event_context_init(talloc_autofree_context());
308
309         /* initialise clustering if needed */
310         cluster_ctdb_init(event_ctx, model);
311
312         if (opt_interactive) {
313                 /* catch EOF on stdin */
314 #ifdef SIGTTIN
315                 signal(SIGTTIN, SIG_IGN);
316 #endif
317                 event_add_fd(event_ctx, event_ctx, 0, EVENT_FD_READ, 
318                              server_stdin_handler,
319                              discard_const(binary_name));
320         }
321
322
323         if (max_runtime) {
324                 event_add_timed(event_ctx, event_ctx, 
325                                 timeval_current_ofs(max_runtime, 0), 
326                                 max_runtime_handler,
327                                 discard_const(binary_name));
328         }
329
330         DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
331         status = server_service_startup(event_ctx, model, lp_server_services());
332         if (!NT_STATUS_IS_OK(status)) {
333                 DEBUG(0,("Starting Services failed - %s\n", nt_errstr(status)));
334                 return 1;
335         }
336
337         /* wait for events - this is where smbd sits for most of its
338            life */
339         event_loop_wait(event_ctx);
340
341         /* as everything hangs off this event context, freeing it
342            should initiate a clean shutdown of all services */
343         talloc_free(event_ctx);
344
345         return 0;
346 }
347
348  int main(int argc, const char *argv[])
349 {
350         return binary_smbd_main("smbd", argc, argv);
351 }