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