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