From 3e2b8405658c9fa521c8bc6457cefaf7cce6cbe6 Mon Sep 17 00:00:00 2001 From: Asanka Herath Date: Wed, 26 May 2010 10:33:50 -0400 Subject: [PATCH] Try both fd and socket ops for net_read() and net_write() When using WinSock, a socket is not a file descriptor and does not interoperate with read()/write(). File descriptors do not work with send()/recv(). However, for net_read() and net_write(), we don't know whether we are dealing with a socket or a file descriptor. So try one, and if it fails, try the other. This is an ugly hack until we clean up the users of this API so it doesn't use sockets and fds interchangably. --- lib/roken/net_read.c | 19 +++++++++++++++++++ lib/roken/net_write.c | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/roken/net_read.c b/lib/roken/net_read.c index b57dda3dd..1f959db95 100644 --- a/lib/roken/net_read.c +++ b/lib/roken/net_read.c @@ -73,8 +73,27 @@ net_read(rk_socket_t sock, void *buf, size_t nbytes) ssize_t count; size_t rem = nbytes; +#ifdef SOCKET_IS_NOT_AN_FD + int use_read = 0; +#endif + while (rem > 0) { +#ifdef SOCKET_IS_NOT_AN_FD + if (use_read) + count = _read (sock, cbuf, rem); + else + count = recv (sock, cbuf, rem, 0); + + if (use_read == 0 && + rk_IS_SOCKET_ERROR(count) && + rk_SOCK_ERRNO == WSAENOTSOCK) { + use_read = 1; + + count = _read (sock, cbuf, rem); + } +#else count = recv (sock, cbuf, rem, 0); +#endif if (count < 0) { /* With WinSock, the error EINTR (WSAEINTR), is used to diff --git a/lib/roken/net_write.c b/lib/roken/net_write.c index 94c9df1c3..402e20915 100644 --- a/lib/roken/net_write.c +++ b/lib/roken/net_write.c @@ -70,9 +70,27 @@ net_write(rk_socket_t sock, const void *buf, size_t nbytes) const char *cbuf = (const char *)buf; ssize_t count; size_t rem = nbytes; +#ifdef SOCKET_IS_NOT_AN_FD + int use_write = 0; +#endif while (rem > 0) { +#ifdef SOCKET_IS_NOT_AN_FD + if (use_write) + count = _write (sock, cbuf, rem); + else + count = send (sock, cbuf, rem, 0); + + if (use_write == 0 && + rk_IS_SOCKET_ERROR(count) && + rk_SOCK_ERRNO == WSAENOTSOCK) { + use_write = 1; + + count = _write (sock, cbuf, rem); + } +#else count = send (sock, cbuf, rem, 0); +#endif if (count < 0) { if (errno == EINTR) continue;