diff --git a/src/node_stdio.cc b/src/node_stdio.cc index a68d302fd1..94ee73a961 100644 --- a/src/node_stdio.cc +++ b/src/node_stdio.cc @@ -65,19 +65,27 @@ static Handle OpenStdin(const Arguments& args) { return scope.Close(Integer::New(STDIN_FILENO)); } -static Handle -IsStdinBlocking (const Arguments& args) -{ - HandleScope scope; - return scope.Close(Boolean::New(!isatty(STDIN_FILENO))); + +static bool IsBlocking(int fd) { + if (isatty(fd)) return false; + struct stat s; + if (fstat(fd, &s)) { + perror("fstat"); + return true; + } + if (s.st_mode & S_IFSOCK == S_IFSOCK) return false; + if (s.st_mode & S_IFIFO == S_IFIFO) return false; + return true; } -static Handle -IsStdoutBlocking (const Arguments& args) -{ - HandleScope scope; - bool tty = isatty(STDOUT_FILENO); - return scope.Close(Boolean::New(!tty)); + +static Handle IsStdinBlocking(const Arguments& arg) { + return IsBlocking(STDIN_FILENO) ? True() : False(); +} + + +static Handle IsStdoutBlocking(const Arguments& args) { + return IsBlocking(STDOUT_FILENO) ? True() : False(); }