Make Read and Write in node_net.cc actually work on sockets
authorBert Belder <bertbelder@gmail.com>
Thu, 25 Nov 2010 04:06:31 +0000 (05:06 +0100)
committerBert Belder <bertbelder@gmail.com>
Mon, 20 Dec 2010 22:51:12 +0000 (23:51 +0100)
src/node_net.cc

index b803fd3..3242fa7 100644 (file)
@@ -668,12 +668,26 @@ static Handle<Value> Read(const Arguments& args) {
           String::New("Length is extends beyond buffer")));
   }
 
+#ifdef __POSIX__
   ssize_t bytes_read = read(fd, (char*)buffer_data + off, len);
 
   if (bytes_read < 0) {
     if (errno == EAGAIN || errno == EINTR) return Null();
     return ThrowException(ErrnoException(errno, "read"));
   }
+#else // __MINGW32__
+  /*
+   * read() should work for in mingw, but always gives EINVAL; someone should really file a bug about it.
+   * We'll use recv() however, it's faster as well.
+   */
+  ssize_t bytes_read = recv(_get_osfhandle(fd), (char*)buffer_data + off, len, 0);
+
+  if (bytes_read < 0) {
+    int wsaErrno = WSAGetLastError();
+    if (wsaErrno == WSAEWOULDBLOCK || wsaErrno == WSAEINTR) return Null();
+    return ThrowException(ErrnoException(wsaErrno, "read"));
+  }
+#endif
 
   return scope.Close(Integer::New(bytes_read));
 }
@@ -872,6 +886,7 @@ static Handle<Value> Write(const Arguments& args) {
           String::New("Length is extends beyond buffer")));
   }
 
+#ifdef __POSIX__
   ssize_t written = write(fd, buffer_data + off, len);
 
   if (written < 0) {
@@ -880,6 +895,21 @@ static Handle<Value> Write(const Arguments& args) {
     }
     return ThrowException(ErrnoException(errno, "write"));
   }
+#else // __MINGW32__
+  /*
+   * write() should work for sockets in mingw, but always gives EINVAL; someone should really file a bug about it.
+   * We'll use send() however, it's faster as well.
+   */
+  ssize_t written = send(_get_osfhandle(fd), buffer_data + off, len, 0);
+
+  if (written < 0) {
+    int wsaErrno = WSAGetLastError();
+    if (errno == WSAEWOULDBLOCK || errno == WSAEINTR) {
+      return scope.Close(Integer::New(0));
+    }
+    return ThrowException(ErrnoException(wsaErrno, "write"));
+  }
+#endif // __MINGW32__
 
   return scope.Close(Integer::New(written));
 }