aboutsummaryrefslogtreecommitdiff
path: root/src/wsocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wsocket.c')
-rw-r--r--src/wsocket.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/wsocket.c b/src/wsocket.c
index 69fac4d..c0686cd 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -45,7 +45,7 @@ int sock_close(void) {
45#define WAITFD_E 4 45#define WAITFD_E 4
46#define WAITFD_C (WAITFD_E|WAITFD_W) 46#define WAITFD_C (WAITFD_E|WAITFD_W)
47 47
48static int sock_waitfd(t_sock fd, int sw, p_tm tm) { 48int sock_waitfd(t_sock fd, int sw, p_tm tm) {
49 int ret; 49 int ret;
50 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; 50 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL;
51 struct timeval tv, *tp = NULL; 51 struct timeval tv, *tp = NULL;
@@ -118,7 +118,17 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
118 /* make sure the system is trying to connect */ 118 /* make sure the system is trying to connect */
119 err = WSAGetLastError(); 119 err = WSAGetLastError();
120 if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS) return err; 120 if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS) return err;
121 /* zero timeout case optimization */
122 if (tm_iszero(tm)) return IO_TIMEOUT;
121 /* we wait until something happens */ 123 /* we wait until something happens */
124 return sock_connected(ps, tm);
125}
126
127/*-------------------------------------------------------------------------*\
128* Check if socket is connected
129\*-------------------------------------------------------------------------*/
130int sock_connected(p_sock ps) {
131 int err;
122 if ((err = sock_waitfd(*ps, WAITFD_C, tm)) == IO_CLOSED) { 132 if ((err = sock_waitfd(*ps, WAITFD_C, tm)) == IO_CLOSED) {
123 int len = sizeof(err); 133 int len = sizeof(err);
124 /* give windows time to set the error (yes, disgusting) */ 134 /* give windows time to set the error (yes, disgusting) */
@@ -126,9 +136,8 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
126 /* find out why we failed */ 136 /* find out why we failed */
127 getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); 137 getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len);
128 /* we KNOW there was an error. if why is 0, we will return 138 /* we KNOW there was an error. if why is 0, we will return
129 * "unknown error", but it's not really our fault */ 139 * "unknown error", but it's not really our fault */
130 return err > 0? err: IO_UNKNOWN; 140 return err > 0? err: IO_UNKNOWN;
131 /* here we deal with the case in which it worked, timedout or weird errors */
132 } else return err; 141 } else return err;
133} 142}
134 143