aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/daemon.c26
-rw-r--r--src/daemon.h6
-rw-r--r--src/listen.c29
-rw-r--r--src/main.c2
4 files changed, 34 insertions, 29 deletions
diff --git a/src/daemon.c b/src/daemon.c
index 09cd5721..56949490 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 da83b85a..f2ea58c5 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 67a40f95..31067ce5 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 c840240a..580f4bf8 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,"");