diff options
author | Eugene Tarassov | 2016-10-21 17:25:52 +0000 |
---|---|---|
committer | Eugene Tarassov | 2016-10-21 17:38:23 +0000 |
commit | 1bd412aa2e825751123223e29a84de3378a7f16f (patch) | |
tree | e29c62ed960c89035274f61e6c3c2f4b0dd1e468 | |
parent | e7b5e35fbc29481672785c6a8c06d69470cf4c86 (diff) | |
download | org.eclipse.tcf.agent-1bd412aa2e825751123223e29a84de3378a7f16f.tar.gz org.eclipse.tcf.agent-1bd412aa2e825751123223e29a84de3378a7f16f.tar.xz org.eclipse.tcf.agent-1bd412aa2e825751123223e29a84de3378a7f16f.zip |
TCF Agent: more socket function wrappers for better error reports on Windows
-rw-r--r-- | agent/tcf/framework/channel_tcp.c | 5 | ||||
-rw-r--r-- | agent/tcf/framework/mdep-inet.h | 23 | ||||
-rw-r--r-- | agent/tcf/framework/mdep.c | 96 |
3 files changed, 92 insertions, 32 deletions
diff --git a/agent/tcf/framework/channel_tcp.c b/agent/tcf/framework/channel_tcp.c index fdc83eb4..9b11fbae 100644 --- a/agent/tcf/framework/channel_tcp.c +++ b/agent/tcf/framework/channel_tcp.c @@ -872,10 +872,7 @@ static ChannelTCP * create_channel(int sock, int en_ssl, int server, int unix_do #if defined(_WIN32) || defined(__CYGWIN__) { unsigned long opts = 1; - if (ioctlsocket((SOCKET)sock, FIONBIO, &opts) != 0) { - set_win32_errno(WSAGetLastError()); - return NULL; - } + if (ioctlsocket((SOCKET)sock, FIONBIO, &opts) < 0) return NULL; } #else { diff --git a/agent/tcf/framework/mdep-inet.h b/agent/tcf/framework/mdep-inet.h index 9e32f858..a0fb49e7 100644 --- a/agent/tcf/framework/mdep-inet.h +++ b/agent/tcf/framework/mdep-inet.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2016 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. @@ -49,10 +49,10 @@ extern int inet_pton(int af, const char * src, void * dst); /* * Windows socket functions don't set errno as expected. * Wrappers are provided to workaround the problem. - * TODO: more socket function wrappers are needed for better error reports on Windows */ #define socket(af, type, protocol) wsa_socket(af, type, protocol) #define connect(socket, addr, addr_size) wsa_connect(socket, addr, addr_size) +#define accept(socket, addr, addr_size) wsa_accept(socket, addr, addr_size) #define bind(socket, addr, addr_size) wsa_bind(socket, addr, addr_size) #define listen(socket, size) wsa_listen(socket, size) #define recv(socket, buf, size, flags) wsa_recv(socket, buf, size, flags) @@ -60,11 +60,16 @@ extern int inet_pton(int af, const char * src, void * dst); #define send(socket, buf, size, flags) wsa_send(socket, buf, size, flags) #define sendto(socket, buf, size, flags, dest_addr, dest_size) wsa_sendto(socket, buf, size, flags, dest_addr, dest_size) #define setsockopt(socket, level, opt, value, size) wsa_setsockopt(socket, level, opt, value, size) +#define getsockopt(socket, level, opt, value, size) wsa_getsockopt(socket, level, opt, value, size) #define getsockname(socket, name, size) wsa_getsockname(socket, name, size) -#define select(nfds, readfds, writefds, exceptfds, timeout) wsa_select(nfds, readfds, writefds, exceptfds, timeout); +#define select(nfds, readfds, writefds, exceptfds, timeout) wsa_select(nfds, readfds, writefds, exceptfds, timeout) +#define ioctlsocket(socket, cmd, args) wsa_ioctlsocket(socket, cmd, args) +#define shutdown(socket, how) wsa_shutdown(socket, how) +#define closesocket(socket) wsa_closesocket(socket) extern int wsa_socket(int af, int type, int protocol); extern int wsa_connect(int socket, const struct sockaddr * addr, int addr_size); +extern int wsa_accept(int socket, struct sockaddr * addr, int * addr_size); extern int wsa_bind(int socket, const struct sockaddr * addr, int addr_size); extern int wsa_listen(int socket, int size); extern int wsa_recv(int socket, void * buf, size_t size, int flags); @@ -74,14 +79,22 @@ extern int wsa_send(int socket, const void * buf, size_t size, int flags); extern int wsa_sendto(int socket, const void * buf, size_t size, int flags, const struct sockaddr * dest_addr, socklen_t dest_size); extern int wsa_setsockopt(int socket, int level, int opt, const char * value, int size); +extern int wsa_getsockopt(int socket, int level, int opt, char * value, int * size); extern int wsa_getsockname(int socket, struct sockaddr * name, int * size); extern int wsa_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval * timeout); +extern int wsa_ioctlsocket(int socket, long cmd, unsigned long * args); +extern int wsa_shutdown(int socket, int how); +extern int wsa_closesocket(int socket); #ifndef SHUT_WR -#define SHUT_WR SD_SEND +# define SHUT_WR SD_SEND #endif #ifndef SHUT_RDWR -#define SHUT_RDWR SD_BOTH +# define SHUT_RDWR SD_BOTH +#endif + +#if !defined(SOCK_MAXADDRLEN) && defined(_SS_MAXSIZE) +# define SOCK_MAXADDRLEN _SS_MAXSIZE #endif #define loc_freeaddrinfo freeaddrinfo diff --git a/agent/tcf/framework/mdep.c b/agent/tcf/framework/mdep.c index ae47857e..ea9db751 100644 --- a/agent/tcf/framework/mdep.c +++ b/agent/tcf/framework/mdep.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2014 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2016 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. @@ -51,13 +51,13 @@ int utf8_locale = 0; #ifndef SIO_UDP_NETRESET #define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR,15) #endif -#undef socket + int wsa_socket(int af, int type, int protocol) { int res = 0; SetLastError(0); WSASetLastError(0); - res = socket(af, type, protocol); + res = (socket)(af, type, protocol); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -71,12 +71,11 @@ int wsa_socket(int af, int type, int protocol) { return res; } -#undef connect int wsa_connect(int socket, const struct sockaddr * addr, int addr_size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = connect(socket, addr, addr_size); + res = (connect)(socket, addr, addr_size); if (res != 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -84,12 +83,23 @@ int wsa_connect(int socket, const struct sockaddr * addr, int addr_size) { return 0; } -#undef bind +int wsa_accept(int socket, struct sockaddr * addr, int * addr_size) { + int res = 0; + SetLastError(0); + WSASetLastError(0); + res = (accept)(socket, addr, addr_size); + if (res < 0) { + set_win32_errno(WSAGetLastError()); + return -1; + } + return res; +} + int wsa_bind(int socket, const struct sockaddr * addr, int addr_size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = bind(socket, addr, addr_size); + res = (bind)(socket, addr, addr_size); if (res != 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -97,12 +107,11 @@ int wsa_bind(int socket, const struct sockaddr * addr, int addr_size) { return 0; } -#undef listen int wsa_listen(int socket, int size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = listen(socket, size); + res = (listen)(socket, size); if (res != 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -110,12 +119,11 @@ int wsa_listen(int socket, int size) { return 0; } -#undef recv int wsa_recv(int socket, void * buf, size_t size, int flags) { int res = 0; SetLastError(0); WSASetLastError(0); - res = recv(socket, (char *)buf, size, flags); + res = (recv)(socket, (char *)buf, size, flags); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -123,13 +131,12 @@ int wsa_recv(int socket, void * buf, size_t size, int flags) { return res; } -#undef recvfrom int wsa_recvfrom(int socket, void * buf, size_t size, int flags, struct sockaddr * addr, socklen_t * addr_size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = recvfrom(socket, (char *)buf, size, flags, addr, addr_size); + res = (recvfrom)(socket, (char *)buf, size, flags, addr, addr_size); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -137,12 +144,11 @@ int wsa_recvfrom(int socket, void * buf, size_t size, int flags, return res; } -#undef send int wsa_send(int socket, const void * buf, size_t size, int flags) { int res = 0; SetLastError(0); WSASetLastError(0); - res = send(socket, (char *)buf, size, flags); + res = (send)(socket, (char *)buf, size, flags); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -150,13 +156,12 @@ int wsa_send(int socket, const void * buf, size_t size, int flags) { return res; } -#undef sendto int wsa_sendto(int socket, const void * buf, size_t size, int flags, const struct sockaddr * dest_addr, socklen_t dest_size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = sendto(socket, (char *)buf, size, flags, dest_addr, dest_size); + res = (sendto)(socket, (char *)buf, size, flags, dest_addr, dest_size); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -164,12 +169,23 @@ int wsa_sendto(int socket, const void * buf, size_t size, int flags, return res; } -#undef setsockopt int wsa_setsockopt(int socket, int level, int opt, const char * value, int size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = setsockopt(socket, level, opt, value, size); + res = (setsockopt)(socket, level, opt, value, size); + if (res != 0) { + set_win32_errno(WSAGetLastError()); + return -1; + } + return 0; +} + +int wsa_getsockopt(int socket, int level, int opt, char * value, int * size) { + int res = 0; + SetLastError(0); + WSASetLastError(0); + res = (getsockopt)(socket, level, opt, value, size); if (res != 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -177,12 +193,11 @@ int wsa_setsockopt(int socket, int level, int opt, const char * value, int size) return 0; } -#undef getsockname int wsa_getsockname(int socket, struct sockaddr * name, int * size) { int res = 0; SetLastError(0); WSASetLastError(0); - res = getsockname(socket, name, size); + res = (getsockname)(socket, name, size); if (res != 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -190,12 +205,11 @@ int wsa_getsockname(int socket, struct sockaddr * name, int * size) { return 0; } -#undef select int wsa_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout) { int res = 0; SetLastError(0); WSASetLastError(0); - res = select(nfds, readfds, writefds, exceptfds, (PTIMEVAL)timeout); + res = (select)(nfds, readfds, writefds, exceptfds, (PTIMEVAL)timeout); if (res < 0) { set_win32_errno(WSAGetLastError()); return -1; @@ -203,6 +217,42 @@ int wsa_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds return res; } +int wsa_ioctlsocket(int socket, long cmd, unsigned long * args) { + int res = 0; + SetLastError(0); + WSASetLastError(0); + res = (ioctlsocket)(socket, cmd, args); + if (res != 0) { + set_win32_errno(WSAGetLastError()); + return -1; + } + return 0; +} + +int wsa_shutdown(int socket, int how) { + int res = 0; + SetLastError(0); + WSASetLastError(0); + res = (shutdown)(socket, how); + if (res != 0) { + set_win32_errno(WSAGetLastError()); + return -1; + } + return 0; +} + +int wsa_closesocket(int socket) { + int res = 0; + SetLastError(0); + WSASetLastError(0); + res = (closesocket)(socket); + if (res != 0) { + set_win32_errno(WSAGetLastError()); + return -1; + } + return 0; +} + /* inet_ntop()/inet_pton() are not available before Windows Vista */ const char * inet_ntop(int af, const void * src, char * dst, socklen_t size) { char * str = NULL; |