Commit bbe8b0ef authored by Eric Wong's avatar Eric Wong

Fix endless loop when mpd is launched from a non-interactive shell.

Thanks to _noth_ for the patch, this fixes Mantis bug #1534 _noth_ wrote: > When MPD is launched from a non-interactive shell, it enters an endless > loop, filling up its error log file with "error accept()'ing" messages. > This is caused by the fact that stdin is already closed when mpd starts > up. listenOnPort() opens up the first of its sockets as fd 0 (the first > empty fd table position). Then, setup_log_output()->redirect_stdin() > overwrites fd0 (fd=open("/dev/null",...); dup2(fd, STDIN_FILENO);) > without checking if it corresponds to the actual standard input (or if > it is open in the first place). This means that listenSockets[0].fd now > is a fd for /dev/null, thus doIOForInterfaces()->getConnections() can't > accept(2) on it and fails with the above error. The attached patch fixes > this for me. git-svn-id: https://svn.musicpd.org/mpd/trunk@6843 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent c2e74210
...@@ -42,7 +42,11 @@ static const char *err_filename; ...@@ -42,7 +42,11 @@ static const char *err_filename;
/* redirect stdin to /dev/null to work around a libao bug */ /* redirect stdin to /dev/null to work around a libao bug */
static void redirect_stdin(void) static void redirect_stdin(void)
{ {
int fd; int fd, st;
struct stat ss;
if ((st = fstat(STDIN_FILENO, &ss)) < 0 || ! isatty(STDIN_FILENO))
return;
if ((fd = open("/dev/null", O_RDONLY)) < 0) if ((fd = open("/dev/null", O_RDONLY)) < 0)
FATAL("failed to open /dev/null %s\n", strerror(errno)); FATAL("failed to open /dev/null %s\n", strerror(errno));
if (dup2(fd, STDIN_FILENO) < 0) if (dup2(fd, STDIN_FILENO) < 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment