From 8b9f7c6eb2452c31613c25d165fcb2c35562805a Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Thu, 25 Nov 2010 05:06:31 +0100 Subject: [PATCH] Make Read and Write in node_net.cc actually work on sockets --- src/node_net.cc | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/node_net.cc b/src/node_net.cc index b803fd3248..3242fa7a6a 100644 --- a/src/node_net.cc +++ b/src/node_net.cc @@ -668,12 +668,26 @@ static Handle 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 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 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)); }