aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/socket.h2
-rw-r--r--src/tcp.c6
-rw-r--r--src/usocket.c26
-rw-r--r--src/wsocket.c26
4 files changed, 31 insertions, 29 deletions
diff --git a/src/socket.h b/src/socket.h
index 639229d..4443bcc 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -49,7 +49,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count,
49void sock_setnonblocking(p_sock ps); 49void sock_setnonblocking(p_sock ps);
50void sock_setblocking(p_sock ps); 50void sock_setblocking(p_sock ps);
51 51
52int sock_waitfd(int fd, int sw, p_tm tm); 52int sock_waitfd(p_sock ps, int sw, p_tm tm);
53int sock_select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_tm tm); 53int sock_select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_tm tm);
54 54
55int sock_connect(p_sock ps, SA *addr, socklen_t addr_len, p_tm tm); 55int sock_connect(p_sock ps, SA *addr, socklen_t addr_len, p_tm tm);
diff --git a/src/tcp.c b/src/tcp.c
index 162d5af..7ff3054 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -228,8 +228,10 @@ static int meth_connect(lua_State *L)
228 228
229static int meth_connected(lua_State *L) 229static int meth_connected(lua_State *L)
230{ 230{
231 p_tcp tcp = (p_tcp) aux_checkclass(L, "tcp{master}", 1); 231 p_tcp tcp;
232 int err = sock_connected(&tcp->sock, &tcp->tm); 232 int err;
233 tcp = (p_tcp) aux_checkclass(L, "tcp{master}", 1);
234 err = sock_connected(&tcp->sock, &tcp->tm);
233 if (err != IO_DONE) { 235 if (err != IO_DONE) {
234 lua_pushnil(L); 236 lua_pushnil(L);
235 lua_pushstring(L, sock_strerror(err)); 237 lua_pushstring(L, sock_strerror(err));
diff --git a/src/usocket.c b/src/usocket.c
index 3428a0c..3e151bf 100644
--- a/src/usocket.c
+++ b/src/usocket.c
@@ -22,10 +22,10 @@
22#define WAITFD_R POLLIN 22#define WAITFD_R POLLIN
23#define WAITFD_W POLLOUT 23#define WAITFD_W POLLOUT
24#define WAITFD_C (POLLIN|POLLOUT) 24#define WAITFD_C (POLLIN|POLLOUT)
25int sock_waitfd(int fd, int sw, p_tm tm) { 25int sock_waitfd(p_sock ps, int sw, p_tm tm) {
26 int ret; 26 int ret;
27 struct pollfd pfd; 27 struct pollfd pfd;
28 pfd.fd = fd; 28 pfd.fd = *ps;
29 pfd.events = sw; 29 pfd.events = sw;
30 pfd.revents = 0; 30 pfd.revents = 0;
31 if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ 31 if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */
@@ -44,7 +44,7 @@ int sock_waitfd(int fd, int sw, p_tm tm) {
44#define WAITFD_W 2 44#define WAITFD_W 2
45#define WAITFD_C (WAITFD_R|WAITFD_W) 45#define WAITFD_C (WAITFD_R|WAITFD_W)
46 46
47int sock_waitfd(int fd, int sw, p_tm tm) { 47int sock_waitfd(p_sock ps, int sw, p_tm tm) {
48 int ret; 48 int ret;
49 fd_set rfds, wfds, *rp, *wp; 49 fd_set rfds, wfds, *rp, *wp;
50 struct timeval tv, *tp; 50 struct timeval tv, *tp;
@@ -53,8 +53,8 @@ int sock_waitfd(int fd, int sw, p_tm tm) {
53 do { 53 do {
54 /* must set bits within loop, because select may have modifed them */ 54 /* must set bits within loop, because select may have modifed them */
55 rp = wp = NULL; 55 rp = wp = NULL;
56 if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(fd, &rfds); rp = &rfds; } 56 if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(*ps, &rfds); rp = &rfds; }
57 if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(fd, &wfds); wp = &wfds; } 57 if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; }
58 t = tm_getretry(tm); 58 t = tm_getretry(tm);
59 tp = NULL; 59 tp = NULL;
60 if (t >= 0.0) { 60 if (t >= 0.0) {
@@ -62,11 +62,11 @@ int sock_waitfd(int fd, int sw, p_tm tm) {
62 tv.tv_usec = (int)((t-tv.tv_sec)*1.0e6); 62 tv.tv_usec = (int)((t-tv.tv_sec)*1.0e6);
63 tp = &tv; 63 tp = &tv;
64 } 64 }
65 ret = select(fd+1, rp, wp, NULL, tp); 65 ret = select(*ps+1, rp, wp, NULL, tp);
66 } while (ret == -1 && errno == EINTR); 66 } while (ret == -1 && errno == EINTR);
67 if (ret == -1) return errno; 67 if (ret == -1) return errno;
68 if (ret == 0) return IO_TIMEOUT; 68 if (ret == 0) return IO_TIMEOUT;
69 if (sw == WAITFD_C && FD_ISSET(fd, &rfds)) return IO_CLOSED; 69 if (sw == WAITFD_C && FD_ISSET(*ps, &rfds)) return IO_CLOSED;
70 return IO_DONE; 70 return IO_DONE;
71} 71}
72#endif 72#endif
@@ -177,7 +177,7 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
177\*-------------------------------------------------------------------------*/ 177\*-------------------------------------------------------------------------*/
178int sock_connected(p_sock ps, p_tm tm) { 178int sock_connected(p_sock ps, p_tm tm) {
179 int err; 179 int err;
180 if ((err = sock_waitfd(*ps, WAITFD_C, tm) == IO_CLOSED)) { 180 if ((err = sock_waitfd(ps, WAITFD_C, tm) == IO_CLOSED)) {
181 if (recv(*ps, (char *) &err, 0, 0) == 0) return IO_DONE; 181 if (recv(*ps, (char *) &err, 0, 0) == 0) return IO_DONE;
182 else return errno; 182 else return errno;
183 } else return err; 183 } else return err;
@@ -198,7 +198,7 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *len, p_tm tm) {
198 err = errno; 198 err = errno;
199 if (err == EINTR) continue; 199 if (err == EINTR) continue;
200 if (err != EAGAIN && err != ECONNABORTED) return err; 200 if (err != EAGAIN && err != ECONNABORTED) return err;
201 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 201 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
202 } 202 }
203 /* can't reach here */ 203 /* can't reach here */
204 return IO_UNKNOWN; 204 return IO_UNKNOWN;
@@ -230,7 +230,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm)
230 /* if failed fatal reason, report error */ 230 /* if failed fatal reason, report error */
231 if (err != EAGAIN) return err; 231 if (err != EAGAIN) return err;
232 /* wait until we can send something or we timeout */ 232 /* wait until we can send something or we timeout */
233 if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; 233 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
234 } 234 }
235 /* can't reach here */ 235 /* can't reach here */
236 return IO_UNKNOWN; 236 return IO_UNKNOWN;
@@ -255,7 +255,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
255 if (put == 0 || err == EPIPE) return IO_CLOSED; 255 if (put == 0 || err == EPIPE) return IO_CLOSED;
256 if (err == EINTR) continue; 256 if (err == EINTR) continue;
257 if (err != EAGAIN) return err; 257 if (err != EAGAIN) return err;
258 if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; 258 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
259 } 259 }
260 return IO_UNKNOWN; 260 return IO_UNKNOWN;
261} 261}
@@ -277,7 +277,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) {
277 if (taken == 0) return IO_CLOSED; 277 if (taken == 0) return IO_CLOSED;
278 if (err == EINTR) continue; 278 if (err == EINTR) continue;
279 if (err != EAGAIN) return err; 279 if (err != EAGAIN) return err;
280 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 280 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
281 } 281 }
282 return IO_UNKNOWN; 282 return IO_UNKNOWN;
283} 283}
@@ -300,7 +300,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
300 if (taken == 0) return IO_CLOSED; 300 if (taken == 0) return IO_CLOSED;
301 if (err == EINTR) continue; 301 if (err == EINTR) continue;
302 if (err != EAGAIN) return err; 302 if (err != EAGAIN) return err;
303 if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; 303 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
304 } 304 }
305 return IO_UNKNOWN; 305 return IO_UNKNOWN;
306} 306}
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}