r14094: Use saner module directory names, fix loading of server service modules.
[jelmer/samba4-debian.git] / source / 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 2 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, write to the Free Software
23    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26 #include "includes.h"
27 #include "lib/events/events.h"
28 #include "version.h"
29 #include "lib/cmdline/popt_common.h"
30 #include "system/dir.h"
31 #include "system/filesys.h"
32 #include "build.h"
33 #include "ldb/include/ldb.h"
34 #include "registry/registry.h"
35 #include "ntvfs/ntvfs.h"
36 #include "ntptr/ntptr.h"
37 #include "auth/gensec/gensec.h"
38 #include "smbd/process_model.h"
39 #include "smbd/service.h"
40 #include "passdb/secrets.h"
41 #include "util/pidfile.h"
42
43 /*
44   recursively delete a directory tree
45 */
46 static void recursive_delete(const char *path)
47 {
48         DIR *dir;
49         struct dirent *de;
50
51         dir = opendir(path);
52         if (!dir) {
53                 return;
54         }
55
56         for (de=readdir(dir);de;de=readdir(dir)) {
57                 char *fname;
58                 struct stat st;
59
60                 if (strcmp(de->d_name, ".") == 0 ||
61                     strcmp(de->d_name, "..") == 0) {
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 /*
108   setup signal masks
109 */
110 static void setup_signals(void)
111 {
112         /* we are never interested in SIGPIPE */
113         BlockSignals(True,SIGPIPE);
114
115 #if defined(SIGFPE)
116         /* we are never interested in SIGFPE */
117         BlockSignals(True,SIGFPE);
118 #endif
119
120         /* We are no longer interested in USR1 */
121         BlockSignals(True, SIGUSR1);
122
123 #if defined(SIGUSR2)
124         /* We are no longer interested in USR2 */
125         BlockSignals(True,SIGUSR2);
126 #endif
127
128         /* POSIX demands that signals are inherited. If the invoking process has
129          * these signals masked, we will have problems, as we won't recieve them. */
130         BlockSignals(False, SIGHUP);
131         BlockSignals(False, SIGTERM);
132
133         CatchSignal(SIGHUP, sig_hup);
134 }
135
136 /*
137   handle io on stdin
138 */
139 static void server_stdin_handler(struct event_context *event_ctx, struct fd_event *fde, 
140                                  uint16_t flags, void *private)
141 {
142         const char *binary_name = private;
143         uint8_t c;
144         if (read(0, &c, 1) == 0) {
145                 DEBUG(0,("%s: EOF on stdin - terminating\n", binary_name));
146                 exit(0);
147         }
148 }
149
150 /*
151   die if the user selected maximum runtime is exceeded
152 */
153 static void max_runtime_handler(struct event_context *ev, struct timed_event *te, 
154                                 struct timeval t, void *private)
155 {
156         const char *binary_name = private;
157         DEBUG(0,("%s: maximum runtime exceeded - terminating\n", binary_name));
158         exit(0);
159 }
160
161 /*
162  main server.
163 */
164 static int binary_smbd_main(const char *binary_name, int argc, const char *argv[])
165 {
166         BOOL interactive = False;
167         int opt;
168         poptContext pc;
169         init_module_fn static_init[] = STATIC_service_MODULES;
170         init_module_fn *shared_init;
171         struct event_context *event_ctx;
172         NTSTATUS status;
173         const char *model = "standard";
174         int max_runtime = 0;
175         struct poptOption long_options[] = {
176                 POPT_AUTOHELP
177                 {"interactive", 'i', POPT_ARG_VAL, &interactive, True, 
178                  "Run interactive (not a daemon)", NULL},
179                 {"model", 'M', POPT_ARG_STRING, &model, True, 
180                  "Select process model", "MODEL"},
181                 {"maximum-runtime", 0, POPT_ARG_INT, &max_runtime, True, 
182                  "set maximum runtime of the server process, till autotermination", "seconds"},
183                 POPT_COMMON_SAMBA
184                 POPT_COMMON_VERSION
185                 POPT_TABLEEND
186         };
187
188         pc = poptGetContext(binary_name, argc, argv, long_options, 0);
189         
190         while((opt = poptGetNextOpt(pc)) != -1) /* noop */ ;
191
192         poptFreeContext(pc);
193
194         setup_logging(binary_name, interactive?DEBUG_STDOUT:DEBUG_FILE);
195         setup_signals();
196
197         /* we want total control over the permissions on created files,
198            so set our umask to 0 */
199         umask(0);
200
201         DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
202         DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2006\n"));
203
204         if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
205                 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
206                 exit(1);
207         }
208
209         if (!interactive) {
210                 DEBUG(3,("Becoming a daemon.\n"));
211                 become_daemon(True);
212         }
213
214         cleanup_tmp_files();
215
216         if (!directory_exist(lp_lockdir())) {
217                 mkdir(lp_lockdir(), 0755);
218         }
219
220         pidfile_create(binary_name);
221
222         /* Do *not* remove this, until you have removed
223          * passdb/secrets.c, and proved that Samba still builds... */
224         /* Setup the SECRETS subsystem */
225         if (!secrets_init()) {
226                 exit(1);
227         }
228
229         ldb_global_init(); /* FIXME: */
230
231         gensec_init(); /* FIXME: */
232
233         registry_init(); /* FIXME: maybe run this in the initialization function 
234                                                 of the winreg RPC server instead? */
235
236         ntptr_init();   /* FIXME: maybe run this in the initialization function 
237                                                 of the spoolss RPC server instead? */
238
239         ntvfs_init();   /* FIXME: maybe run this in the initialization functions 
240                                                 of the SMB[,2] server instead? */
241
242         process_model_init(); 
243
244         shared_init = load_samba_modules(NULL, "service");
245
246         run_init_functions(static_init);
247         run_init_functions(shared_init);
248
249         talloc_free(shared_init);
250         
251         /* the event context is the top level structure in smbd. Everything else
252            should hang off that */
253         event_ctx = event_context_init(NULL);
254
255         if (interactive) {
256                 /* catch EOF on stdin */
257 #ifdef SIGTTIN
258                 signal(SIGTTIN, SIG_IGN);
259 #endif
260                 event_add_fd(event_ctx, event_ctx, 0, EVENT_FD_READ, 
261                              server_stdin_handler,
262                              discard_const(binary_name));
263         }
264
265
266         if (max_runtime) {
267                 event_add_timed(event_ctx, event_ctx, 
268                                 timeval_current_ofs(max_runtime, 0), 
269                                 max_runtime_handler,
270                                 discard_const(binary_name));
271         }
272
273         DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
274         status = server_service_startup(event_ctx, model, lp_server_services());
275         if (!NT_STATUS_IS_OK(status)) {
276                 DEBUG(0,("Starting Services failed - %s\n", nt_errstr(status)));
277                 return 1;
278         }
279
280         /* wait for events - this is where smbd sits for most of its
281            life */
282         event_loop_wait(event_ctx);
283
284         /* as everything hangs off this event context, freeing it
285            should initiate a clean shutdown of all services */
286         talloc_free(event_ctx);
287
288         return 0;
289 }
290
291  int main(int argc, const char *argv[])
292 {
293         return binary_smbd_main("smbd", argc, argv);
294 }