improve test for stdio non-blockingness
authorRyan Dahl <ry@tinyclouds.org>
Fri, 21 May 2010 08:22:20 +0000 (01:22 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Fri, 21 May 2010 08:22:20 +0000 (01:22 -0700)
src/node_stdio.cc

index a68d302..94ee73a 100644 (file)
@@ -65,19 +65,27 @@ static Handle<Value> OpenStdin(const Arguments& args) {
   return scope.Close(Integer::New(STDIN_FILENO));
 }
 
-static Handle<Value>
-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<Value>
-IsStdoutBlocking (const Arguments& args)
-{
-  HandleScope scope;
-  bool tty = isatty(STDOUT_FILENO);
-  return scope.Close(Boolean::New(!tty));
+
+static Handle<Value> IsStdinBlocking(const Arguments& arg) {
+  return IsBlocking(STDIN_FILENO) ? True() : False();
+}
+
+
+static Handle<Value> IsStdoutBlocking(const Arguments& args) {
+  return IsBlocking(STDOUT_FILENO) ? True() : False();
 }