diff options
author | Werner Koch <[email protected]> | 2007-10-02 08:44:21 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2007-10-02 08:44:21 +0000 |
commit | 28f7b6e0413097e91d9f28da028064d1ba9071eb (patch) | |
tree | 0bb5bd56293ab5f3a7548cece238c35696d47513 /src/assuan-io.c | |
parent | Add socket wrapper API. (diff) | |
download | libassuan-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.c | 37 |
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*/ |