Add support for duplicating stderr into our logfiles.
authorAndrew Bartlett <abartlet@samba.org>
Sat, 20 Jul 2002 07:02:45 +0000 (07:02 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Sat, 20 Jul 2002 07:02:45 +0000 (07:02 +0000)
This is for two things:  To allow panic actions etc to pump out backtraces to
stderr and to allow vangrind to put its stuff in a logfile - making it possible
to debug smbd when launched from inetd.

I've also cleaned up some of the duplicate names in procedures between smbd and
nmbd.

Andrew Bartlett

source/lib/debug.c
source/lib/util.c
source/smbd/server.c

index f41c3b649760961fa8a4514036a3f731b4c9b1f8..c43a98f4fad889dc2e07cd6bec9114859dc1eecf 100644 (file)
@@ -602,6 +602,12 @@ BOOL reopen_logs( void )
        force_check_log_size();
        (void)umask(oldumask);
 
+       /* Take over stderr to catch ouput into logs */
+       if (sys_dup2(dbf->fd, 2) == -1) {
+               close_low_fds(True); /* Close stderr too, if dup2 can't point it
+                                       at the logfile */
+       }
+
        return ret;
 }
 
index 51c926dd0b813d5919137f4e11ca05f0b5538325..bcef3013f9d82b9b5056dc5708df1b4c5d6b6545 100644 (file)
@@ -503,30 +503,33 @@ void make_dir_struct(char *buf,char *mask,char *fname,SMB_OFF_T size,int mode,ti
 /*******************************************************************
 close the low 3 fd's and open dev/null in their place
 ********************************************************************/
-void close_low_fds(void)
+void close_low_fds(BOOL stderr_too)
 {
-#ifndef VALGRIND
   int fd;
   int i;
   close(0); close(1); 
-#ifndef __INSURE__
-  close(2);
-#endif
+
+  if (stderr_too) {
+         close(2);
+  }
+
   /* try and use up these file descriptors, so silly
      library routines writing to stdout etc won't cause havoc */
   for (i=0;i<3;i++) {
-    fd = sys_open("/dev/null",O_RDWR,0);
-    if (fd < 0) fd = sys_open("/dev/null",O_WRONLY,0);
-    if (fd < 0) {
-      DEBUG(0,("Can't open /dev/null\n"));
-      return;
-    }
-    if (fd != i) {
-      DEBUG(0,("Didn't get file descriptor %d\n",i));
-      return;
-    }
+         if (i == 2 && !stderr_too)
+                 continue;
+
+         fd = sys_open("/dev/null",O_RDWR,0);
+         if (fd < 0) fd = sys_open("/dev/null",O_WRONLY,0);
+         if (fd < 0) {
+                 DEBUG(0,("Can't open /dev/null\n"));
+                 return;
+         }
+         if (fd != i) {
+                 DEBUG(0,("Didn't get file descriptor %d\n",i));
+                 return;
+         }
   }
-#endif
 }
 
 /****************************************************************************
@@ -680,7 +683,8 @@ void become_daemon(void)
 #endif /* HAVE_SETSID */
 
        /* Close fd's 0,1,2. Needed if started by rsh */
-       close_low_fds();
+       close_low_fds(False);  /* Don't close stderr, let the debug system
+                                 attach it to the logfile */
 }
 
 
index e1e651365978d6660b08d67f5fda952d375ae619..a0d448151fa09e13ac70ecb6d7a9ce3f4dba7788 100644 (file)
@@ -133,7 +133,7 @@ static BOOL open_sockets_inetd(void)
        smbd_set_server_fd(dup(0));
        
        /* close our standard file descriptors */
-       close_low_fds();
+       close_low_fds(False); /* Don't close stderr */
        
        set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
        set_socket_options(smbd_server_fd(), user_socket_options);
@@ -151,7 +151,7 @@ static void msg_exit_server(int msg_type, pid_t src, void *buf, size_t len)
  Open the socket communication.
 ****************************************************************************/
 
-static BOOL open_sockets(BOOL is_daemon,int port)
+static BOOL open_sockets_smbd(BOOL is_daemon,int port)
 {
        int num_interfaces = iface_count();
        int fd_listenset[FD_SETSIZE];
@@ -187,7 +187,7 @@ static BOOL open_sockets(BOOL is_daemon,int port)
                */
                
                if(num_interfaces > FD_SETSIZE) {
-                       DEBUG(0,("open_sockets: Too many interfaces specified to bind to. Number was %d \
+                       DEBUG(0,("open_sockets_smbd: Too many interfaces specified to bind to. Number was %d \
 max can be %d\n", 
                                 num_interfaces, FD_SETSIZE));
                        return False;
@@ -199,7 +199,7 @@ max can be %d\n",
                        struct in_addr *ifip = iface_n_ip(i);
                        
                        if(ifip == NULL) {
-                               DEBUG(0,("open_sockets: interface %d has NULL IP address !\n", i));
+                               DEBUG(0,("open_sockets_smbd: interface %d has NULL IP address !\n", i));
                                continue;
                        }
                        s = fd_listenset[i] = open_socket_in(SOCK_STREAM, port, 0, ifip->s_addr, True);
@@ -233,7 +233,7 @@ max can be %d\n",
                set_socket_options(s,user_socket_options);
 
                if (listen(s, 5) == -1) {
-                       DEBUG(0,("open_sockets: listen: %s\n",
+                       DEBUG(0,("open_sockets_smbd: listen: %s\n",
                                 strerror(errno)));
                        close(s);
                        return False;
@@ -309,7 +309,7 @@ max can be %d\n",
                                continue;
                        
                        if (smbd_server_fd() == -1) {
-                               DEBUG(0,("open_sockets: accept: %s\n",
+                               DEBUG(0,("open_sockets_smbd: accept: %s\n",
                                         strerror(errno)));
                                continue;
                        }
@@ -323,7 +323,7 @@ max can be %d\n",
                                
                                /* close our standard file
                                   descriptors */
-                               close_low_fds();
+                               close_low_fds(False);
                                am_parent = 0;
                                
                                set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
@@ -837,7 +837,7 @@ static void usage(char *pname)
           start_background_queue(); 
        */
 
-       if (!open_sockets(is_daemon,port))
+       if (!open_sockets_smbd(is_daemon,port))
                exit(1);
 
        /*