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