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