diff options
-rw-r--r-- | source3/lib/debug.c | 6 | ||||
-rw-r--r-- | source3/lib/util.c | 38 | ||||
-rw-r--r-- | source3/smbd/server.c | 16 |
3 files changed, 35 insertions, 25 deletions
diff --git a/source3/lib/debug.c b/source3/lib/debug.c index f41c3b6497..c43a98f4fa 100644 --- a/source3/lib/debug.c +++ b/source3/lib/debug.c @@ -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; } diff --git a/source3/lib/util.c b/source3/lib/util.c index 51c926dd0b..bcef3013f9 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -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 */ } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index e1e6513659..a0d448151f 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -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); /* |