Redirect stdin *before* we establish a listen socket

This way we'll avoid listening on fd=0 and have a better
chance of having fd=0 as /dev/null

git-svn-id: https://svn.musicpd.org/mpd/trunk@6852 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Eric Wong 2007-09-05 01:19:37 +00:00
parent 7992ff37d0
commit ac58dce7df
2 changed files with 29 additions and 29 deletions

View File

@ -50,6 +50,34 @@ 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)) {
DEBUG("stdin closed, and could not open /dev/null "
"as fd=0, some external library bugs "
"may be exposed...\n");
close(fd);
}
return;
}
if (!isatty(STDIN_FILENO))
return;
if ((fd = open("/dev/null", O_RDONLY)) < 0)
FATAL("failed to open /dev/null %s\n", strerror(errno));
if (dup2(fd, STDIN_FILENO) < 0)
FATAL("dup2 stdin: %s\n", strerror(errno));
}
static int establishListen(unsigned int port,
struct sockaddr *addrp, socklen_t addrlen)
{
@ -196,6 +224,7 @@ void listenOnPort(void)
boundPort = port;
redirect_stdin();
do {
parseListenConfigParam(port, param);
} while ((param = getNextConfigParam(CONF_BIND_TO_ADDRESS, param)));

View File

@ -39,34 +39,6 @@ static int err_fd = -1;
static const char *out_filename;
static const char *err_filename;
/*
* 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)) {
DEBUG("stdin closed, and could not open /dev/null "
"as fd=0, some external library bugs "
"may be exposed...\n");
close(fd);
}
return;
}
if (!isatty(STDIN_FILENO))
return;
if ((fd = open("/dev/null", O_RDONLY)) < 0)
FATAL("failed to open /dev/null %s\n", strerror(errno));
if (dup2(fd, STDIN_FILENO) < 0)
FATAL("dup2 stdin: %s\n", strerror(errno));
}
static void redirect_logs(void)
{
assert(out_fd > 0);
@ -197,7 +169,6 @@ void setup_log_output(const int use_stdout)
stdout_mode = 0;
flushWarningLog();
}
redirect_stdin();
}
#define log_func(func,level,fp) \