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