Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2016-10-21 17:25:52 +0000
committerEugene Tarassov2016-10-21 17:38:23 +0000
commit1bd412aa2e825751123223e29a84de3378a7f16f (patch)
treee29c62ed960c89035274f61e6c3c2f4b0dd1e468
parente7b5e35fbc29481672785c6a8c06d69470cf4c86 (diff)
downloadorg.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.c5
-rw-r--r--agent/tcf/framework/mdep-inet.h23
-rw-r--r--agent/tcf/framework/mdep.c96
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;

Back to the top