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