aboutsummaryrefslogtreecommitdiffstats
path: root/src/assuan-io.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2007-10-02 08:44:21 +0000
committerWerner Koch <[email protected]>2007-10-02 08:44:21 +0000
commit28f7b6e0413097e91d9f28da028064d1ba9071eb (patch)
tree0bb5bd56293ab5f3a7548cece238c35696d47513 /src/assuan-io.c
parentAdd socket wrapper API. (diff)
downloadlibassuan-28f7b6e0413097e91d9f28da028064d1ba9071eb.tar.gz
libassuan-28f7b6e0413097e91d9f28da028064d1ba9071eb.zip
Add new API assuan_set_sock_nonce.
Fixed a blocking problem on Windows.
Diffstat (limited to 'src/assuan-io.c')
-rw-r--r--src/assuan-io.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/assuan-io.c b/src/assuan-io.c
index df5fe57..eb50f7a 100644
--- a/src/assuan-io.c
+++ b/src/assuan-io.c
@@ -56,22 +56,33 @@ _assuan_io_read (assuan_fd_t fd, void *buffer, size_t size)
int n;
n = recv (HANDLE2SOCKET(fd), buffer, size, 0);
- if (n == -1 && WSAGetLastError () == WSAENOTSOCK)
+ if (n == -1)
{
- DWORD nread = 0;
-
- n = ReadFile (fd, buffer, size, &nread, NULL);
- if (!n)
+ switch (WSAGetLastError ())
{
- switch (GetLastError())
- {
- case ERROR_BROKEN_PIPE: errno = EPIPE; break;
- default: errno = EIO;
- }
- n = -1;
+ case WSAENOTSOCK:
+ {
+ DWORD nread = 0;
+
+ n = ReadFile (fd, buffer, size, &nread, NULL);
+ if (!n)
+ {
+ switch (GetLastError())
+ {
+ case ERROR_BROKEN_PIPE: errno = EPIPE; break;
+ default: errno = EIO;
+ }
+ n = -1;
+ }
+ else
+ n = (int)nread;
+ }
+ break;
+
+ case WSAEWOULDBLOCK: errno = EAGAIN; break;
+ case ERROR_BROKEN_PIPE: errno = EPIPE; break;
+ default: errno = EIO; break;
}
- else
- n = (int)nread;
}
return n;
#else /*!HAVE_W32_SYSTEM*/