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