diff options
Diffstat (limited to 'src/wsocket.c')
-rw-r--r-- | src/wsocket.c | 15 |
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 | ||
48 | static int sock_waitfd(t_sock fd, int sw, p_tm tm) { | 48 | int 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 | \*-------------------------------------------------------------------------*/ | ||
130 | int 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 | ||