diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/daemon.c | 26 | ||||
-rw-r--r-- | src/daemon.h | 6 | ||||
-rw-r--r-- | src/listen.c | 29 | ||||
-rw-r--r-- | src/main.c | 2 |
4 files changed, 34 insertions, 29 deletions
diff --git a/src/daemon.c b/src/daemon.c index 09cd5721a..569494908 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -24,6 +24,32 @@ #include <unistd.h> #include <errno.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +void +daemonize_close_stdin(void) +{ + int fd, st; + struct stat ss; + + if ((st = fstat(STDIN_FILENO, &ss)) < 0) { + if ((fd = open("/dev/null", O_RDONLY) > 0)) { + g_debug("stdin closed, and could not open /dev/null " + "as fd=0, some external library bugs " + "may be exposed..."); + close(fd); + } + return; + } + if (!isatty(STDIN_FILENO)) + return; + if ((fd = open("/dev/null", O_RDONLY)) < 0) + g_error("failed to open /dev/null %s", strerror(errno)); + if (dup2(fd, STDIN_FILENO) < 0) + g_error("dup2 stdin: %s", strerror(errno)); +} void daemonize(Options *options) diff --git a/src/daemon.h b/src/daemon.h index da83b85a8..f2ea58c5f 100644 --- a/src/daemon.h +++ b/src/daemon.h @@ -21,6 +21,12 @@ #include "cmdline.h" +/** + * Close stdin (fd 0) and re-open it as /dev/null. + */ +void +daemonize_close_stdin(void); + void daemonize(Options *options); diff --git a/src/listen.c b/src/listen.c index 67a40f95c..31067ce5a 100644 --- a/src/listen.c +++ b/src/listen.c @@ -49,34 +49,6 @@ static int *listenSockets; static int numberOfListenSockets; int boundPort; -/* - * redirect stdin to /dev/null to work around a libao bug - * there are likely other bugs in other libraries (and even our code!) - * that check for fd > 0, so it's easiest to just keep - * fd = 0 == /dev/null for now... - */ -static void redirect_stdin(void) -{ - int fd, st; - struct stat ss; - - if ((st = fstat(STDIN_FILENO, &ss)) < 0) { - if ((fd = open("/dev/null", O_RDONLY) > 0)) { - g_debug("stdin closed, and could not open /dev/null " - "as fd=0, some external library bugs " - "may be exposed..."); - close(fd); - } - return; - } - if (!isatty(STDIN_FILENO)) - return; - if ((fd = open("/dev/null", O_RDONLY)) < 0) - g_error("failed to open /dev/null %s", strerror(errno)); - if (dup2(fd, STDIN_FILENO) < 0) - g_error("dup2 stdin: %s", strerror(errno)); -} - static int establishListen(int pf, const struct sockaddr *addrp, socklen_t addrlen) { @@ -245,7 +217,6 @@ void listenOnPort(void) boundPort = port; - redirect_stdin(); do { parseListenConfigParam(port, param); } while ((param = getNextConfigParam(CONF_BIND_TO_ADDRESS, param))); diff --git a/src/main.c b/src/main.c index c840240a3..580f4bf8b 100644 --- a/src/main.c +++ b/src/main.c @@ -186,6 +186,8 @@ int main(int argc, char *argv[]) clock_t start; GTimer *save_state_timer; + daemonize_close_stdin(); + #ifdef HAVE_LOCALE /* initialize locale */ setlocale(LC_CTYPE,""); |