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