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