diff options
author | Marcus Brinkmann <mb@g10code.com> | 2007-10-05 16:01:12 +0000 |
---|---|---|
committer | Marcus Brinkmann <mb@g10code.com> | 2007-10-05 16:01:12 +0000 |
commit | 0c12494ae485f7c025731a98183417d1afe2895c (patch) | |
tree | 5660f0922d5a4c3b76d5f7e72a9ab2def374bf3e /src/assuan-socket.c | |
parent | ba56511854f8726e8c4222e09f3497727a8b5ae5 (diff) | |
download | libassuan-0c12494ae485f7c025731a98183417d1afe2895c.tar.gz |
2007-10-05 Marcus Brinkmann <marcus@g10code.de>
* assuan-defs.h (_assuan_sock_wsa2errno) [HAVE_W32_SYSTEM]: Add prototype.
* assuan-uds.c (wsa2errno) [HAVE_W32_SYSTEM]: Move and rename to ...
* assuan-socket.c (_assuan_sock_wsa2errno) [HAVE_W32_SYSTEM]: ... this.
(_assuan_close, _assuan_sock_new, _assuan_sock_connect, _assuan_sock_bind):
Always set errno on error.
Diffstat (limited to 'src/assuan-socket.c')
-rw-r--r-- | src/assuan-socket.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/assuan-socket.c b/src/assuan-socket.c index d2a01f7..81beacd 100644 --- a/src/assuan-socket.c +++ b/src/assuan-socket.c @@ -57,8 +57,25 @@ #ifdef HAVE_W32_SYSTEM +int +_assuan_sock_wsa2errno (int err) +{ + switch (err) + { + case WSAENOTSOCK: + return EINVAL; + case WSAEWOULDBLOCK: + return EAGAIN; + case ERROR_BROKEN_PIPE: + return EPIPE; + default: + return EIO; + } +} + + /* W32: Fill BUFFER with LENGTH bytes of random. Returns -1 on - failure, 0 on success. */ + failure, 0 on success. Sets errno on failure. */ static int get_nonce (char *buffer, size_t nbytes) { @@ -81,7 +98,7 @@ get_nonce (char *buffer, size_t nbytes) /* W32: The buffer for NONCE needs to be at least 16 bytes. Returns 0 on - success. */ + success and sets errno on failure. */ static int read_port_and_nonce (const char *fname, unsigned short *port, char *nonce) { @@ -128,9 +145,14 @@ _assuan_close (assuan_fd_t fd) { #ifdef HAVE_W32_SYSTEM int rc = closesocket (HANDLE2SOCKET(fd)); + if (rc) + errno = _assuan_sock_wsa2errno (WSAGetLastError ()); if (rc && WSAGetLastError () == WSAENOTSOCK) { rc = CloseHandle (fd); + if (rc) + /* FIXME. */ + errno = EIO; } return rc; #else @@ -146,9 +168,13 @@ assuan_fd_t _assuan_sock_new (int domain, int type, int proto) { #ifdef HAVE_W32_SYSTEM + int res; if (domain == AF_UNIX || domain == AF_LOCAL) domain = AF_INET; - return SOCKET2HANDLE(socket (domain, type, proto)); + res = SOCKET2HANDLE(socket (domain, type, proto)); + if (res < 0) + errno = _assuan_sock_wsa2errno (WSAGetLastError ()); + return res; #else return socket (domain, type, proto); #endif @@ -195,7 +221,13 @@ _assuan_sock_connect (assuan_fd_t sockfd, struct sockaddr *addr, int addrlen) return ret; } else - return connect (HANDLE2SOCKET (sockfd), addr, addrlen); + { + int res; + res = connect (HANDLE2SOCKET (sockfd), addr, addrlen); + if (res < 0) + errno = _assuan_sock_wsa2errno (WSAGetLastError ()); + return res; + } #else return connect (sockfd, addr, addrlen); #endif @@ -262,7 +294,12 @@ _assuan_sock_bind (assuan_fd_t sockfd, struct sockaddr *addr, int addrlen) return 0; } else - return bind (HANDLE2SOCKET(sockfd), addr, addrlen); + { + int res = bind (HANDLE2SOCKET(sockfd), addr, addrlen); + if (res < 0) + errno = _assuan_sock_wsa2errno (WSAGetLastError ()); + return res; + } #else return bind (sockfd, addr, addrlen); #endif |