s3:idmap_tdb: move idmap_tdb_init_hwm up.
[amitay/samba.git] / source3 / smbd / server.c
1 /*
2    Unix SMB/CIFS implementation.
3    Main SMB server routines
4    Copyright (C) Andrew Tridgell                1992-1998
5    Copyright (C) Martin Pool                    2002
6    Copyright (C) Jelmer Vernooij                2002-2003
7    Copyright (C) Volker Lendecke                1993-2007
8    Copyright (C) Jeremy Allison                 1993-2007
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "includes.h"
25 #include "popt_common.h"
26 #include "smbd/globals.h"
27 #include "librpc/gen_ndr/messaging.h"
28 #include "registry.h"
29 #include "libcli/auth/schannel.h"
30 #include "secrets.h"
31
32 #include "../librpc/gen_ndr/srv_dfs.h"
33 #include "../librpc/gen_ndr/srv_dssetup.h"
34 #include "../librpc/gen_ndr/srv_echo.h"
35 #include "../librpc/gen_ndr/srv_eventlog.h"
36 #include "../librpc/gen_ndr/srv_initshutdown.h"
37 #include "../librpc/gen_ndr/srv_lsa.h"
38 #include "../librpc/gen_ndr/srv_netlogon.h"
39 #include "../librpc/gen_ndr/srv_ntsvcs.h"
40 #include "../librpc/gen_ndr/srv_samr.h"
41 #include "../librpc/gen_ndr/srv_spoolss.h"
42 #include "../librpc/gen_ndr/srv_srvsvc.h"
43 #include "../librpc/gen_ndr/srv_svcctl.h"
44 #include "../librpc/gen_ndr/srv_winreg.h"
45 #include "../librpc/gen_ndr/srv_wkssvc.h"
46
47 #include "printing/nt_printing_migrate.h"
48
49 static_decl_rpc;
50
51 #ifdef WITH_DFS
52 extern int dcelogin_atmost_once;
53 #endif /* WITH_DFS */
54
55 int smbd_server_fd(void)
56 {
57         return server_fd;
58 }
59
60 static void smbd_set_server_fd(int fd)
61 {
62         server_fd = fd;
63 }
64
65 int get_client_fd(void)
66 {
67         return server_fd;
68 }
69
70 struct event_context *smbd_event_context(void)
71 {
72         return server_event_context();
73 }
74
75 /*******************************************************************
76  What to do when smb.conf is updated.
77  ********************************************************************/
78
79 static void smb_conf_updated(struct messaging_context *msg,
80                              void *private_data,
81                              uint32_t msg_type,
82                              struct server_id server_id,
83                              DATA_BLOB *data)
84 {
85         DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
86                   "updated. Reloading.\n"));
87         change_to_root_user();
88         reload_services(msg, False);
89 }
90
91
92 /*******************************************************************
93  Delete a statcache entry.
94  ********************************************************************/
95
96 static void smb_stat_cache_delete(struct messaging_context *msg,
97                                   void *private_data,
98                                   uint32_t msg_tnype,
99                                   struct server_id server_id,
100                                   DATA_BLOB *data)
101 {
102         const char *name = (const char *)data->data;
103         DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
104         stat_cache_delete(name);
105 }
106
107 /****************************************************************************
108   Send a SIGTERM to our process group.
109 *****************************************************************************/
110
111 static void  killkids(void)
112 {
113         if(am_parent) kill(0,SIGTERM);
114 }
115
116 /****************************************************************************
117  Process a sam sync message - not sure whether to do this here or
118  somewhere else.
119 ****************************************************************************/
120
121 static void msg_sam_sync(struct messaging_context *msg,
122                          void *private_data,
123                          uint32_t msg_type,
124                          struct server_id server_id,
125                          DATA_BLOB *data)
126 {
127         DEBUG(10, ("** sam sync message received, ignoring\n"));
128 }
129
130 static void msg_exit_server(struct messaging_context *msg,
131                             void *private_data,
132                             uint32_t msg_type,
133                             struct server_id server_id,
134                             DATA_BLOB *data)
135 {
136         DEBUG(3, ("got a SHUTDOWN message\n"));
137         exit_server_cleanly(NULL);
138 }
139
140 #ifdef DEVELOPER
141 static void msg_inject_fault(struct messaging_context *msg,
142                              void *private_data,
143                              uint32_t msg_type,
144                              struct server_id src,
145                              DATA_BLOB *data)
146 {
147         int sig;
148
149         if (data->length != sizeof(sig)) {
150                 DEBUG(0, ("Process %s sent bogus signal injection request\n",
151                           procid_str_static(&src)));
152                 return;
153         }
154
155         sig = *(int *)data->data;
156         if (sig == -1) {
157                 exit_server("internal error injected");
158                 return;
159         }
160
161 #if HAVE_STRSIGNAL
162         DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
163                   procid_str_static(&src), sig, strsignal(sig)));
164 #else
165         DEBUG(0, ("Process %s requested injection of signal %d\n",
166                   procid_str_static(&src), sig));
167 #endif
168
169         kill(sys_getpid(), sig);
170 }
171 #endif /* DEVELOPER */
172
173 /*
174  * Parent smbd process sets its own debug level first and then
175  * sends a message to all the smbd children to adjust their debug
176  * level to that of the parent.
177  */
178
179 static void smbd_msg_debug(struct messaging_context *msg_ctx,
180                            void *private_data,
181                            uint32_t msg_type,
182                            struct server_id server_id,
183                            DATA_BLOB *data)
184 {
185         struct child_pid *child;
186
187         debug_message(msg_ctx, private_data, MSG_DEBUG, server_id, data);
188
189         for (child = children; child != NULL; child = child->next) {
190                 messaging_send_buf(msg_ctx, pid_to_procid(child->pid),
191                                    MSG_DEBUG,
192                                    data->data,
193                                    strlen((char *) data->data) + 1);
194         }
195 }
196
197 static void add_child_pid(pid_t pid)
198 {
199         struct child_pid *child;
200
201         child = SMB_MALLOC_P(struct child_pid);
202         if (child == NULL) {
203                 DEBUG(0, ("Could not add child struct -- malloc failed\n"));
204                 return;
205         }
206         child->pid = pid;
207         DLIST_ADD(children, child);
208         num_children += 1;
209 }
210
211 /*
212   at most every smbd:cleanuptime seconds (default 20), we scan the BRL
213   and locking database for entries to cleanup. As a side effect this
214   also cleans up dead entries in the connections database (due to the
215   traversal in message_send_all()
216
217   Using a timer for this prevents a flood of traversals when a large
218   number of clients disconnect at the same time (perhaps due to a
219   network outage).  
220 */
221
222 static void cleanup_timeout_fn(struct event_context *event_ctx,
223                                 struct timed_event *te,
224                                 struct timeval now,
225                                 void *private_data)
226 {
227         struct timed_event **cleanup_te = (struct timed_event **)private_data;
228
229         DEBUG(1,("Cleaning up brl and lock database after unclean shutdown\n"));
230         message_send_all(smbd_messaging_context(), MSG_SMB_UNLOCK, NULL, 0, NULL);
231         messaging_send_buf(smbd_messaging_context(), procid_self(),
232                                 MSG_SMB_BRL_VALIDATE, NULL, 0);
233         /* mark the cleanup as having been done */
234         (*cleanup_te) = NULL;
235 }
236
237 static void remove_child_pid(pid_t pid, bool unclean_shutdown)
238 {
239         struct child_pid *child;
240         static struct timed_event *cleanup_te;
241         struct server_id child_id;
242
243         if (unclean_shutdown) {
244                 /* a child terminated uncleanly so tickle all
245                    processes to see if they can grab any of the
246                    pending locks
247                 */
248                 DEBUG(3,(__location__ " Unclean shutdown of pid %u\n",
249                         (unsigned int)pid));
250                 if (!cleanup_te) {
251                         /* call the cleanup timer, but not too often */
252                         int cleanup_time = lp_parm_int(-1, "smbd", "cleanuptime", 20);
253                         cleanup_te = event_add_timed(smbd_event_context(), NULL,
254                                                 timeval_current_ofs(cleanup_time, 0),
255                                                 cleanup_timeout_fn,
256                                                 &cleanup_te);
257                         DEBUG(1,("Scheduled cleanup of brl and lock database after unclean shutdown\n"));
258                 }
259         }
260
261         child_id = procid_self(); /* Just initialize pid and potentially vnn */
262         child_id.pid = pid;
263
264         if (!serverid_deregister(child_id)) {
265                 DEBUG(1, ("Could not remove pid %d from serverid.tdb\n",
266                           (int)pid));
267         }
268
269         for (child = children; child != NULL; child = child->next) {
270                 if (child->pid == pid) {
271                         struct child_pid *tmp = child;
272                         DLIST_REMOVE(children, child);
273                         SAFE_FREE(tmp);
274                         num_children -= 1;
275                         return;
276                 }
277         }
278
279         DEBUG(0, ("Could not find child %d -- ignoring\n", (int)pid));
280 }
281
282 /****************************************************************************
283  Have we reached the process limit ?
284 ****************************************************************************/
285
286 static bool allowable_number_of_smbd_processes(void)
287 {
288         int max_processes = lp_max_smbd_processes();
289
290         if (!max_processes)
291                 return True;
292
293         return num_children < max_processes;
294 }
295
296 static void smbd_sig_chld_handler(struct tevent_context *ev,
297                                   struct tevent_signal *se,
298                                   int signum,
299                                   int count,
300                                   void *siginfo,
301                                   void *private_data)
302 {
303         pid_t pid;
304         int status;
305
306         while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
307                 bool unclean_shutdown = False;
308
309                 /* If the child terminated normally, assume
310                    it was an unclean shutdown unless the
311                    status is 0
312                 */
313                 if (WIFEXITED(status)) {
314                         unclean_shutdown = WEXITSTATUS(status);
315                 }
316                 /* If the child terminated due to a signal
317                    we always assume it was unclean.
318                 */
319                 if (WIFSIGNALED(status)) {
320                         unclean_shutdown = True;
321                 }
322                 remove_child_pid(pid, unclean_shutdown);
323         }
324 }
325
326 static void smbd_setup_sig_chld_handler(void)
327 {
328         struct tevent_signal *se;
329
330         se = tevent_add_signal(smbd_event_context(),
331                                smbd_event_context(),
332                                SIGCHLD, 0,
333                                smbd_sig_chld_handler,
334                                NULL);
335         if (!se) {
336                 exit_server("failed to setup SIGCHLD handler");
337         }
338 }
339
340 struct smbd_open_socket;
341
342 struct smbd_parent_context {
343         bool interactive;
344
345         /* the list of listening sockets */
346         struct smbd_open_socket *sockets;
347 };
348
349 struct smbd_open_socket {
350         struct smbd_open_socket *prev, *next;
351         struct smbd_parent_context *parent;
352         int fd;
353         struct tevent_fd *fde;
354 };
355
356 static void smbd_open_socket_close_fn(struct tevent_context *ev,
357                                       struct tevent_fd *fde,
358                                       int fd,
359                                       void *private_data)
360 {
361         /* this might be the socket_wrapper swrap_close() */
362         close(fd);
363 }
364
365 static void smbd_accept_connection(struct tevent_context *ev,
366                                    struct tevent_fd *fde,
367                                    uint16_t flags,
368                                    void *private_data)
369 {
370         struct smbd_open_socket *s = talloc_get_type_abort(private_data,
371                                      struct smbd_open_socket);
372         struct sockaddr_storage addr;
373         socklen_t in_addrlen = sizeof(addr);
374         pid_t pid = 0;
375         uint64_t unique_id;
376
377         smbd_set_server_fd(accept(s->fd, (struct sockaddr *)(void *)&addr,&in_addrlen));
378
379         if (smbd_server_fd() == -1 && errno == EINTR)
380                 return;
381
382         if (smbd_server_fd() == -1) {
383                 DEBUG(0,("open_sockets_smbd: accept: %s\n",
384                          strerror(errno)));
385                 return;
386         }
387
388         if (s->parent->interactive) {
389                 smbd_process(smbd_server_conn);
390                 exit_server_cleanly("end of interactive mode");
391                 return;
392         }
393
394         if (!allowable_number_of_smbd_processes()) {
395                 close(smbd_server_fd());
396                 smbd_set_server_fd(-1);
397                 return;
398         }
399
400         /*
401          * Generate a unique id in the parent process so that we use
402          * the global random state in the parent.
403          */
404         generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
405
406         pid = sys_fork();
407         if (pid == 0) {
408                 NTSTATUS status = NT_STATUS_OK;
409
410                 /* Child code ... */
411                 am_parent = 0;
412
413                 set_my_unique_id(unique_id);
414
415                 /* Stop zombies, the parent explicitly handles
416                  * them, counting worker smbds. */
417                 CatchChild();
418
419                 /* close our standard file
420                    descriptors */
421                 close_low_fds(False);
422
423                 /*
424                  * Can't use TALLOC_FREE here. Nulling out the argument to it
425                  * would overwrite memory we've just freed.
426                  */
427                 talloc_free(s->parent);
428                 s = NULL;
429
430                 status = reinit_after_fork(smbd_messaging_context(),
431                                            smbd_event_context(), procid_self(),
432                                            true);
433                 if (!NT_STATUS_IS_OK(status)) {
434                         if (NT_STATUS_EQUAL(status,
435                                             NT_STATUS_TOO_MANY_OPENED_FILES)) {
436                                 DEBUG(0,("child process cannot initialize "
437                                          "because too many files are open\n"));
438                                 goto exit;
439                         }
440                         DEBUG(0,("reinit_after_fork() failed\n"));
441                         smb_panic("reinit_after_fork() failed");
442                 }
443
444                 smbd_setup_sig_term_handler();
445                 smbd_setup_sig_hup_handler(server_event_context(),
446                                            server_messaging_context());
447
448                 if (!serverid_register(procid_self(),
449                                        FLAG_MSG_GENERAL|FLAG_MSG_SMBD
450                                        |FLAG_MSG_DBWRAP
451                                        |FLAG_MSG_PRINT_GENERAL)) {
452                         exit_server_cleanly("Could not register myself in "
453                                             "serverid.tdb");
454                 }
455
456                 smbd_process(smbd_server_conn);
457          exit:
458                 exit_server_cleanly("end of child");
459                 return;
460         }
461
462         if (pid < 0) {
463                 DEBUG(0,("smbd_accept_connection: sys_fork() failed: %s\n",
464                          strerror(errno)));
465         }
466
467         /* The parent doesn't need this socket */
468         close(smbd_server_fd());
469
470         /* Sun May 6 18:56:14 2001 ackley@cs.unm.edu:
471                 Clear the closed fd info out of server_fd --
472                 and more importantly, out of client_fd in
473                 util_sock.c, to avoid a possible
474                 getpeername failure if we reopen the logs
475                 and use %I in the filename.
476         */
477
478         smbd_set_server_fd(-1);
479
480         if (pid != 0) {
481                 add_child_pid(pid);
482         }
483
484         /* Force parent to check log size after
485          * spawning child.  Fix from
486          * klausr@ITAP.Physik.Uni-Stuttgart.De.  The
487          * parent smbd will log to logserver.smb.  It
488          * writes only two messages for each child
489          * started/finished. But each child writes,
490          * say, 50 messages also in logserver.smb,
491          * begining with the debug_count of the
492          * parent, before the child opens its own log
493          * file logserver.client. In a worst case
494          * scenario the size of logserver.smb would be
495          * checked after about 50*50=2500 messages
496          * (ca. 100kb).
497          * */
498         force_check_log_size();
499 }
500
501 static bool smbd_open_one_socket(struct smbd_parent_context *parent,
502                                  const struct sockaddr_storage *ifss,
503                                  uint16_t port)
504 {
505         struct smbd_open_socket *s;
506
507         s = talloc(parent, struct smbd_open_socket);
508         if (!s) {
509                 return false;
510         }
511
512         s->parent = parent;
513         s->fd = open_socket_in(SOCK_STREAM,
514                                port,
515                                parent->sockets == NULL ? 0 : 2,
516                                ifss,
517                                true);
518         if (s->fd == -1) {
519                 DEBUG(0,("smbd_open_once_socket: open_socket_in: "
520                         "%s\n", strerror(errno)));
521                 TALLOC_FREE(s);
522                 /*
523                  * We ignore an error here, as we've done before
524                  */
525                 return true;
526         }
527
528         /* ready to listen */
529         set_socket_options(s->fd, "SO_KEEPALIVE");
530         set_socket_options(s->fd, lp_socket_options());
531
532         /* Set server socket to
533          * non-blocking for the accept. */
534         set_blocking(s->fd, False);
535
536         if (listen(s->fd, SMBD_LISTEN_BACKLOG) == -1) {
537                 DEBUG(0,("open_sockets_smbd: listen: "
538                         "%s\n", strerror(errno)));
539                         close(s->fd);
540                 TALLOC_FREE(s);
541                 return false;
542         }
543
544         s->fde = tevent_add_fd(smbd_event_context(),
545                                s,
546                                s->fd, TEVENT_FD_READ,
547                                smbd_accept_connection,
548                                s);
549         if (!s->fde) {
550                 DEBUG(0,("open_sockets_smbd: "
551                          "tevent_add_fd: %s\n",
552                          strerror(errno)));
553                 close(s->fd);
554                 TALLOC_FREE(s);
555                 return false;
556         }
557         tevent_fd_set_close_fn(s->fde, smbd_open_socket_close_fn);
558
559         DLIST_ADD_END(parent->sockets, s, struct smbd_open_socket *);
560
561         return true;
562 }
563
564 /****************************************************************************
565  Open the socket communication.
566 ****************************************************************************/
567
568 static bool open_sockets_smbd(struct smbd_parent_context *parent,
569                               const char *smb_ports)
570 {
571         int num_interfaces = iface_count();
572         int i;
573         char *ports;
574         unsigned dns_port = 0;
575
576 #ifdef HAVE_ATEXIT
577         atexit(killkids);
578 #endif
579
580         /* Stop zombies */
581         smbd_setup_sig_chld_handler();
582
583         /* use a reasonable default set of ports - listing on 445 and 139 */
584         if (!smb_ports) {
585                 ports = lp_smb_ports();
586                 if (!ports || !*ports) {
587                         ports = talloc_strdup(talloc_tos(), SMB_PORTS);
588                 } else {
589                         ports = talloc_strdup(talloc_tos(), ports);
590                 }
591         } else {
592                 ports = talloc_strdup(talloc_tos(), smb_ports);
593         }
594
595         if (lp_interfaces() && lp_bind_interfaces_only()) {
596                 /* We have been given an interfaces line, and been
597                    told to only bind to those interfaces. Create a
598                    socket per interface and bind to only these.
599                 */
600
601                 /* Now open a listen socket for each of the
602                    interfaces. */
603                 for(i = 0; i < num_interfaces; i++) {
604                         const struct sockaddr_storage *ifss =
605                                         iface_n_sockaddr_storage(i);
606                         char *tok;
607                         const char *ptr;
608
609                         if (ifss == NULL) {
610                                 DEBUG(0,("open_sockets_smbd: "
611                                         "interface %d has NULL IP address !\n",
612                                         i));
613                                 continue;
614                         }
615
616                         for (ptr=ports;
617                              next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
618                                 unsigned port = atoi(tok);
619                                 if (port == 0 || port > 0xffff) {
620                                         continue;
621                                 }
622
623                                 if (!smbd_open_one_socket(parent, ifss, port)) {
624                                         return false;
625                                 }
626                         }
627                 }
628         } else {
629                 /* Just bind to 0.0.0.0 - accept connections
630                    from anywhere. */
631
632                 char *tok;
633                 const char *ptr;
634                 const char *sock_addr = lp_socket_address();
635                 char *sock_tok;
636                 const char *sock_ptr;
637
638                 if (strequal(sock_addr, "0.0.0.0") ||
639                     strequal(sock_addr, "::")) {
640 #if HAVE_IPV6
641                         sock_addr = "::,0.0.0.0";
642 #else
643                         sock_addr = "0.0.0.0";
644 #endif
645                 }
646
647                 for (sock_ptr=sock_addr;
648                      next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
649                         for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) {
650                                 struct sockaddr_storage ss;
651
652                                 unsigned port = atoi(tok);
653                                 if (port == 0 || port > 0xffff) {
654                                         continue;
655                                 }
656
657                                 /* Keep the first port for mDNS service
658                                  * registration.
659                                  */
660                                 if (dns_port == 0) {
661                                         dns_port = port;
662                                 }
663
664                                 /* open an incoming socket */
665                                 if (!interpret_string_addr(&ss, sock_tok,
666                                                 AI_NUMERICHOST|AI_PASSIVE)) {
667                                         continue;
668                                 }
669
670                                 if (!smbd_open_one_socket(parent, &ss, port)) {
671                                         return false;
672                                 }
673                         }
674                 }
675         }
676
677         if (parent->sockets == NULL) {
678                 DEBUG(0,("open_sockets_smbd: No "
679                         "sockets available to bind to.\n"));
680                 return false;
681         }
682
683         /* Setup the main smbd so that we can get messages. Note that
684            do this after starting listening. This is needed as when in
685            clustered mode, ctdb won't allow us to start doing database
686            operations until it has gone thru a full startup, which
687            includes checking to see that smbd is listening. */
688
689         if (!serverid_register(procid_self(),
690                                FLAG_MSG_GENERAL|FLAG_MSG_SMBD
691                                |FLAG_MSG_DBWRAP)) {
692                 DEBUG(0, ("open_sockets_smbd: Failed to register "
693                           "myself in serverid.tdb\n"));
694                 return false;
695         }
696
697         /* Listen to messages */
698
699         messaging_register(smbd_messaging_context(), NULL,
700                            MSG_SMB_SAM_SYNC, msg_sam_sync);
701         messaging_register(smbd_messaging_context(), NULL,
702                            MSG_SHUTDOWN, msg_exit_server);
703         messaging_register(smbd_messaging_context(), NULL,
704                            MSG_SMB_FILE_RENAME, msg_file_was_renamed);
705         messaging_register(smbd_messaging_context(), NULL,
706                            MSG_SMB_CONF_UPDATED, smb_conf_updated);
707         messaging_register(smbd_messaging_context(), NULL,
708                            MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete);
709         messaging_register(smbd_messaging_context(), NULL,
710                            MSG_DEBUG, smbd_msg_debug);
711         brl_register_msgs(smbd_messaging_context());
712
713 #ifdef CLUSTER_SUPPORT
714         if (lp_clustering()) {
715                 ctdbd_register_reconfigure(
716                         messaging_ctdbd_connection(procid_self()));
717         }
718 #endif
719
720 #ifdef DEVELOPER
721         messaging_register(smbd_messaging_context(), NULL,
722                            MSG_SMB_INJECT_FAULT, msg_inject_fault);
723 #endif
724
725         if (dns_port != 0) {
726 #ifdef WITH_DNSSD_SUPPORT
727                 smbd_setup_mdns_registration(smbd_event_context(),
728                                              parent, dns_port);
729 #endif
730 #ifdef WITH_AVAHI_SUPPORT
731                 void *avahi_conn;
732
733                 avahi_conn = avahi_start_register(
734                         smbd_event_context(), smbd_event_context(), dns_port);
735                 if (avahi_conn == NULL) {
736                         DEBUG(10, ("avahi_start_register failed\n"));
737                 }
738 #endif
739         }
740
741         return true;
742 }
743
744 static void smbd_parent_loop(struct smbd_parent_context *parent)
745 {
746         /* now accept incoming connections - forking a new process
747            for each incoming connection */
748         DEBUG(2,("waiting for connections\n"));
749         while (1) {
750                 int ret;
751                 TALLOC_CTX *frame = talloc_stackframe();
752
753                 ret = tevent_loop_once(smbd_event_context());
754                 if (ret != 0) {
755                         exit_server_cleanly("tevent_loop_once() error");
756                 }
757
758                 TALLOC_FREE(frame);
759         } /* end while 1 */
760
761 /* NOTREACHED   return True; */
762 }
763
764
765 /****************************************************************************
766  Initialise connect, service and file structs.
767 ****************************************************************************/
768
769 static bool init_structs(void )
770 {
771         /*
772          * Set the machine NETBIOS name if not already
773          * set from the config file.
774          */
775
776         if (!init_names())
777                 return False;
778
779         file_init();
780
781         if (!secrets_init())
782                 return False;
783
784         return True;
785 }
786
787 static bool spoolss_init_cb(void *ptr)
788 {
789         struct messaging_context *msg_ctx = talloc_get_type_abort(
790                 ptr, struct messaging_context);
791         return nt_printing_tdb_migrate(msg_ctx);
792 }
793
794 /****************************************************************************
795  main program.
796 ****************************************************************************/
797
798 /* Declare prototype for build_options() to avoid having to run it through
799    mkproto.h.  Mixing $(builddir) and $(srcdir) source files in the current
800    prototype generation system is too complicated. */
801
802 extern void build_options(bool screen);
803
804  int main(int argc,const char *argv[])
805 {
806         /* shall I run as a daemon */
807         bool is_daemon = false;
808         bool interactive = false;
809         bool Fork = true;
810         bool no_process_group = false;
811         bool log_stdout = false;
812         char *ports = NULL;
813         char *profile_level = NULL;
814         int opt;
815         poptContext pc;
816         bool print_build_options = False;
817         enum {
818                 OPT_DAEMON = 1000,
819                 OPT_INTERACTIVE,
820                 OPT_FORK,
821                 OPT_NO_PROCESS_GROUP,
822                 OPT_LOG_STDOUT
823         };
824         struct poptOption long_options[] = {
825         POPT_AUTOHELP
826         {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" },
827         {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"},
828         {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" },
829         {"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" },
830         {"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" },
831         {"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
832         {"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
833         {"profiling-level", 'P', POPT_ARG_STRING, &profile_level, 0, "Set profiling level","PROFILE_LEVEL"},
834         POPT_COMMON_SAMBA
835         POPT_COMMON_DYNCONFIG
836         POPT_TABLEEND
837         };
838         struct smbd_parent_context *parent = NULL;
839         TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
840         NTSTATUS status;
841         uint64_t unique_id;
842         struct rpc_srv_callbacks spoolss_cb;
843
844         /* Initialize the event context, it will panic on error */
845         smbd_event_context();
846
847         smbd_init_globals();
848
849         TimeInit();
850
851 #ifdef HAVE_SET_AUTH_PARAMETERS
852         set_auth_parameters(argc,argv);
853 #endif
854
855         pc = poptGetContext("smbd", argc, argv, long_options, 0);
856         while((opt = poptGetNextOpt(pc)) != -1) {
857                 switch (opt)  {
858                 case OPT_DAEMON:
859                         is_daemon = true;
860                         break;
861                 case OPT_INTERACTIVE:
862                         interactive = true;
863                         break;
864                 case OPT_FORK:
865                         Fork = false;
866                         break;
867                 case OPT_NO_PROCESS_GROUP:
868                         no_process_group = true;
869                         break;
870                 case OPT_LOG_STDOUT:
871                         log_stdout = true;
872                         break;
873                 case 'b':
874                         print_build_options = True;
875                         break;
876                 default:
877                         d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
878                                   poptBadOption(pc, 0), poptStrerror(opt));
879                         poptPrintUsage(pc, stderr, 0);
880                         exit(1);
881                 }
882         }
883         poptFreeContext(pc);
884
885         if (interactive) {
886                 Fork = False;
887                 log_stdout = True;
888         }
889
890         setup_logging(argv[0],log_stdout);
891
892         if (print_build_options) {
893                 build_options(True); /* Display output to screen as well as debug */
894                 exit(0);
895         }
896
897         load_case_tables();
898
899 #ifdef HAVE_SETLUID
900         /* needed for SecureWare on SCO */
901         setluid(0);
902 #endif
903
904         set_remote_machine_name("smbd", False);
905
906         if (interactive && (DEBUGLEVEL >= 9)) {
907                 talloc_enable_leak_report();
908         }
909
910         if (log_stdout && Fork) {
911                 DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
912                 exit(1);
913         }
914
915         /* we want to re-seed early to prevent time delays causing
916            client problems at a later date. (tridge) */
917         generate_random_buffer(NULL, 0);
918
919         /* get initial effective uid and gid */
920         sec_init();
921
922         /* make absolutely sure we run as root - to handle cases where people
923            are crazy enough to have it setuid */
924         gain_root_privilege();
925         gain_root_group_privilege();
926
927         fault_setup((void (*)(void *))exit_server_fault);
928         dump_core_setup("smbd");
929
930         /* we are never interested in SIGPIPE */
931         BlockSignals(True,SIGPIPE);
932
933 #if defined(SIGFPE)
934         /* we are never interested in SIGFPE */
935         BlockSignals(True,SIGFPE);
936 #endif
937
938 #if defined(SIGUSR2)
939         /* We are no longer interested in USR2 */
940         BlockSignals(True,SIGUSR2);
941 #endif
942
943         /* POSIX demands that signals are inherited. If the invoking process has
944          * these signals masked, we will have problems, as we won't recieve them. */
945         BlockSignals(False, SIGHUP);
946         BlockSignals(False, SIGUSR1);
947         BlockSignals(False, SIGTERM);
948
949         /* Ensure we leave no zombies until we
950          * correctly set up child handling below. */
951
952         CatchChild();
953
954         /* we want total control over the permissions on created files,
955            so set our umask to 0 */
956         umask(0);
957
958         reopen_logs();
959
960         DEBUG(0,("smbd version %s started.\n", samba_version_string()));
961         DEBUGADD(0,("%s\n", COPYRIGHT_STARTUP_MESSAGE));
962
963         DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
964                  (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid()));
965
966         /* Output the build options to the debug log */ 
967         build_options(False);
968
969         if (sizeof(uint16) < 2 || sizeof(uint32) < 4) {
970                 DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
971                 exit(1);
972         }
973
974         if (!lp_load_initial_only(get_dyn_CONFIGFILE())) {
975                 DEBUG(0, ("error opening config file\n"));
976                 exit(1);
977         }
978
979         /* Init the security context and global current_user */
980         init_sec_ctx();
981
982         if (smbd_messaging_context() == NULL)
983                 exit(1);
984
985         /*
986          * Reloading of the printers will not work here as we don't have a
987          * server info and rpc services set up. It will be called later.
988          */
989         if (!reload_services(smbd_messaging_context(), False)) {
990                 exit(1);
991         }
992
993         /* ...NOTE... Log files are working from this point! */
994
995         DEBUG(3,("loaded services\n"));
996
997         init_structs();
998
999 #ifdef WITH_PROFILE
1000         if (!profile_setup(smbd_messaging_context(), False)) {
1001                 DEBUG(0,("ERROR: failed to setup profiling\n"));
1002                 return -1;
1003         }
1004         if (profile_level != NULL) {
1005                 int pl = atoi(profile_level);
1006                 struct server_id src;
1007
1008                 DEBUG(1, ("setting profiling level: %s\n",profile_level));
1009                 src.pid = getpid();
1010                 set_profile_level(pl, src);
1011         }
1012 #endif
1013
1014         if (!is_daemon && !is_a_socket(0)) {
1015                 if (!interactive)
1016                         DEBUG(0,("standard input is not a socket, assuming -D option\n"));
1017
1018                 /*
1019                  * Setting is_daemon here prevents us from eventually calling
1020                  * the open_sockets_inetd()
1021                  */
1022
1023                 is_daemon = True;
1024         }
1025
1026         if (is_daemon && !interactive) {
1027                 DEBUG( 3, ( "Becoming a daemon.\n" ) );
1028                 become_daemon(Fork, no_process_group, log_stdout);
1029         }
1030
1031         generate_random_buffer((uint8_t *)&unique_id, sizeof(unique_id));
1032         set_my_unique_id(unique_id);
1033
1034 #if HAVE_SETPGID
1035         /*
1036          * If we're interactive we want to set our own process group for
1037          * signal management.
1038          */
1039         if (interactive && !no_process_group)
1040                 setpgid( (pid_t)0, (pid_t)0);
1041 #endif
1042
1043         if (!directory_exist(lp_lockdir()))
1044                 mkdir(lp_lockdir(), 0755);
1045
1046         if (is_daemon)
1047                 pidfile_create("smbd");
1048
1049         status = reinit_after_fork(smbd_messaging_context(),
1050                                    smbd_event_context(),
1051                                    procid_self(), false);
1052         if (!NT_STATUS_IS_OK(status)) {
1053                 DEBUG(0,("reinit_after_fork() failed\n"));
1054                 exit(1);
1055         }
1056
1057         smbd_server_conn->msg_ctx = smbd_messaging_context();
1058
1059         smbd_setup_sig_term_handler();
1060         smbd_setup_sig_hup_handler(smbd_event_context(),
1061                                    smbd_server_conn->msg_ctx);
1062
1063         /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
1064
1065         if (smbd_memcache() == NULL) {
1066                 exit(1);
1067         }
1068
1069         memcache_set_global(smbd_memcache());
1070
1071         /* Initialise the password backed before the global_sam_sid
1072            to ensure that we fetch from ldap before we make a domain sid up */
1073
1074         if(!initialize_password_db(False, smbd_event_context()))
1075                 exit(1);
1076
1077         if (!secrets_init()) {
1078                 DEBUG(0, ("ERROR: smbd can not open secrets.tdb\n"));
1079                 exit(1);
1080         }
1081
1082         if (lp_server_role() == ROLE_DOMAIN_BDC || lp_server_role() == ROLE_DOMAIN_PDC) {
1083                 if (!open_schannel_session_store(NULL, lp_private_dir())) {
1084                         DEBUG(0,("ERROR: Samba cannot open schannel store for secured NETLOGON operations.\n"));
1085                         exit(1);
1086                 }
1087         }
1088
1089         if(!get_global_sam_sid()) {
1090                 DEBUG(0,("ERROR: Samba cannot create a SAM SID.\n"));
1091                 exit(1);
1092         }
1093
1094         if (!sessionid_init()) {
1095                 exit(1);
1096         }
1097
1098         if (!connections_init(True))
1099                 exit(1);
1100
1101         if (!locking_init())
1102                 exit(1);
1103
1104         if (!messaging_tdb_parent_init()) {
1105                 exit(1);
1106         }
1107
1108         if (!notify_internal_parent_init()) {
1109                 exit(1);
1110         }
1111
1112         if (!serverid_parent_init()) {
1113                 exit(1);
1114         }
1115
1116         if (!W_ERROR_IS_OK(registry_init_full()))
1117                 exit(1);
1118
1119         if (!print_backend_init(smbd_messaging_context()))
1120                 exit(1);
1121
1122 #if 0
1123         if (!init_svcctl_db())
1124                 exit(1);
1125 #endif
1126
1127         /* Open the share_info.tdb here, so we don't have to open
1128            after the fork on every single connection.  This is a small
1129            performance improvment and reduces the total number of system
1130            fds used. */
1131         if (!share_info_db_init()) {
1132                 DEBUG(0,("ERROR: failed to load share info db.\n"));
1133                 exit(1);
1134         }
1135
1136         if (!init_system_info()) {
1137                 DEBUG(0,("ERROR: failed to setup system user info.\n"));
1138                 return -1;
1139         }
1140
1141         if (!init_guest_info()) {
1142                 DEBUG(0,("ERROR: failed to setup guest info.\n"));
1143                 return -1;
1144         }
1145
1146         /*
1147          * Initialize spoolss with an init function to convert printers first.
1148          * static_init_rpc will try to initialize the spoolss server too but you
1149          * can't register it twice.
1150          */
1151         spoolss_cb.init = spoolss_init_cb;
1152         spoolss_cb.shutdown = NULL;
1153         spoolss_cb.private_data = smbd_server_conn->msg_ctx;
1154
1155         /* Spoolss depends on a winreg pipe, so start it first. */
1156         if (!NT_STATUS_IS_OK(rpc_winreg_init(NULL))) {
1157                 exit(1);
1158         }
1159
1160         if (!NT_STATUS_IS_OK(rpc_spoolss_init(&spoolss_cb))) {
1161                 exit(1);
1162         }
1163
1164         static_init_rpc;
1165
1166         /* Publish nt printers, this requires a working winreg pipe */
1167         reload_printers(smbd_messaging_context());
1168
1169         /* only start the background queue daemon if we are 
1170            running as a daemon -- bad things will happen if
1171            smbd is launched via inetd and we fork a copy of 
1172            ourselves here */
1173
1174         if (is_daemon && !interactive
1175             && lp_parm_bool(-1, "smbd", "backgroundqueue", true)) {
1176                 start_background_queue(smbd_event_context(),
1177                                        smbd_messaging_context());
1178         }
1179
1180         if (!is_daemon) {
1181                 /* inetd mode */
1182                 TALLOC_FREE(frame);
1183
1184                 /* Started from inetd. fd 0 is the socket. */
1185                 /* We will abort gracefully when the client or remote system
1186                    goes away */
1187                 smbd_set_server_fd(dup(0));
1188
1189                 /* close our standard file descriptors */
1190                 close_low_fds(False); /* Don't close stderr */
1191
1192 #ifdef HAVE_ATEXIT
1193                 atexit(killkids);
1194 #endif
1195
1196                 /* Stop zombies */
1197                 smbd_setup_sig_chld_handler();
1198
1199                 smbd_process(smbd_server_conn);
1200
1201                 exit_server_cleanly(NULL);
1202                 return(0);
1203         }
1204
1205         parent = talloc_zero(smbd_event_context(), struct smbd_parent_context);
1206         if (!parent) {
1207                 exit_server("talloc(struct smbd_parent_context) failed");
1208         }
1209         parent->interactive = interactive;
1210
1211         if (!open_sockets_smbd(parent, ports))
1212                 exit_server("open_sockets_smbd() failed");
1213
1214         TALLOC_FREE(frame);
1215         /* make sure we always have a valid stackframe */
1216         frame = talloc_stackframe();
1217
1218         smbd_parent_loop(parent);
1219
1220         exit_server_cleanly(NULL);
1221         TALLOC_FREE(frame);
1222         return(0);
1223 }