listen: moved redirect_stdin() to daemon.c

redirect_stdin() is a daemonization function, and disconnecting from
the standard input is always a good idea for MPD.
This commit is contained in:
Max Kellermann 2008-12-30 16:28:13 +01:00
parent 671480814c
commit 6c0f5fc612
4 changed files with 34 additions and 29 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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)));

View File

@ -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,"");