aboutsummaryrefslogtreecommitdiff
path: root/src/wsocket.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2005-03-11 00:20:21 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2005-03-11 00:20:21 +0000
commite57f9e9964ac16b1fd09028ea533457f3029d296 (patch)
treec500d0de9381444ddfc96985b329e7a254cd1a59 /src/wsocket.c
parent63e3d7c5b0886a4243dd426b2a9f58d2173b26cf (diff)
downloadluasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.tar.gz
luasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.tar.bz2
luasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.zip
Apparently, non-blocking connect doesn't work on windows if you use 0
timeout in the select call...
Diffstat (limited to 'src/wsocket.c')
-rw-r--r--src/wsocket.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/wsocket.c b/src/wsocket.c
index c0686cd..8b00fa5 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -45,15 +45,15 @@ 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
48int sock_waitfd(t_sock fd, int sw, p_tm tm) { 48int sock_waitfd(p_sock ps, 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;
52 double t; 52 double t;
53 if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ 53 if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */
54 if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(fd, &rfds); rp = &rfds; } 54 if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(*ps, &rfds); rp = &rfds; }
55 if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(fd, &wfds); wp = &wfds; } 55 if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; }
56 if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(fd, &efds); ep = &efds; } 56 if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(*ps, &efds); ep = &efds; }
57 if ((t = tm_get(tm)) >= 0.0) { 57 if ((t = tm_get(tm)) >= 0.0) {
58 tv.tv_sec = (int) t; 58 tv.tv_sec = (int) t;
59 tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6); 59 tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6);
@@ -62,7 +62,7 @@ int sock_waitfd(t_sock fd, int sw, p_tm tm) {
62 ret = select(0, rp, wp, ep, tp); 62 ret = select(0, rp, wp, ep, tp);
63 if (ret == -1) return WSAGetLastError(); 63 if (ret == -1) return WSAGetLastError();
64 if (ret == 0) return IO_TIMEOUT; 64 if (ret == 0) return IO_TIMEOUT;
65 if (sw == WAITFD_C && FD_ISSET(fd, &efds)) return IO_CLOSED; 65 if (sw == WAITFD_C && FD_ISSET(*ps, &efds)) return IO_CLOSED;
66 return IO_DONE; 66 return IO_DONE;
67} 67}
68 68
@@ -127,15 +127,15 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
127/*-------------------------------------------------------------------------*\ 127/*-------------------------------------------------------------------------*\
128* Check if socket is connected 128* Check if socket is connected
129\*-------------------------------------------------------------------------*/ 129\*-------------------------------------------------------------------------*/
130int sock_connected(p_sock ps) { 130int sock_connected(p_sock ps, p_tm tm) {
131 int err; 131 int err;
132 if ((err = sock_waitfd(*ps, WAITFD_C, tm)) == IO_CLOSED) { 132 if ((err = sock_waitfd(ps, WAITFD_C, tm)) == IO_CLOSED) {
133 int len = sizeof(err); 133 int len = sizeof(err);
134 /* give windows time to set the error (yes, disgusting) */ 134 /* give windows time to set the error (yes, disgusting) */
135 Sleep(0); 135 Sleep(0);
136 /* find out why we failed */ 136 /* find out why we failed */
137 getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); 137 getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len);
138 /* 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
139 * "unknown error", but it's not really our fault */ 139 * "unknown error", but it's not really our fault */
140 return err > 0? err: IO_UNKNOWN; 140 return err > 0? err: IO_UNKNOWN;
141 } else return err; 141 } else return err;
@@ -181,7 +181,7 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *len, p_tm tm) {
181 /* if we failed because there was no connectoin, keep trying */ 181 /* if we failed because there was no connectoin, keep trying */
182 if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err; 182 if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err;
183 /* call select to avoid busy wait */ 183 /* call select to avoid busy wait */
184 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 184 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
185 } 185 }
186 /* can't reach here */ 186 /* can't reach here */
187 return IO_UNKNOWN; 187 return IO_UNKNOWN;
@@ -213,7 +213,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm)
213 /* we can only proceed if there was no serious error */ 213 /* we can only proceed if there was no serious error */
214 if (err != WSAEWOULDBLOCK) return err; 214 if (err != WSAEWOULDBLOCK) return err;
215 /* avoid busy wait */ 215 /* avoid busy wait */
216 if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; 216 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
217 } 217 }
218 /* can't reach here */ 218 /* can't reach here */
219 return IO_UNKNOWN; 219 return IO_UNKNOWN;
@@ -236,7 +236,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
236 } 236 }
237 err = WSAGetLastError(); 237 err = WSAGetLastError();
238 if (err != WSAEWOULDBLOCK) return err; 238 if (err != WSAEWOULDBLOCK) return err;
239 if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; 239 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
240 } 240 }
241 return IO_UNKNOWN; 241 return IO_UNKNOWN;
242} 242}
@@ -257,7 +257,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) {
257 if (taken == 0) return IO_CLOSED; 257 if (taken == 0) return IO_CLOSED;
258 err = WSAGetLastError(); 258 err = WSAGetLastError();
259 if (err != WSAEWOULDBLOCK) return err; 259 if (err != WSAEWOULDBLOCK) return err;
260 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 260 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
261 } 261 }
262 return IO_UNKNOWN; 262 return IO_UNKNOWN;
263} 263}
@@ -279,7 +279,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
279 if (taken == 0) return IO_CLOSED; 279 if (taken == 0) return IO_CLOSED;
280 err = WSAGetLastError(); 280 err = WSAGetLastError();
281 if (err != WSAEWOULDBLOCK) return err; 281 if (err != WSAEWOULDBLOCK) return err;
282 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 282 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
283 } 283 }
284 return IO_UNKNOWN; 284 return IO_UNKNOWN;
285} 285}