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