diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-02-08 10:01:01 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-02-08 10:01:01 +0000 |
| commit | 8d4e240f6ae50d9b22ddc44f5e207018935da907 (patch) | |
| tree | d8ca9a51dc35534592f700e42740feac20242ede /src/wsocket.c | |
| parent | 5d32848674b723521e87836eafa24f5ae8f80a89 (diff) | |
| download | luasocket-8d4e240f6ae50d9b22ddc44f5e207018935da907.tar.gz luasocket-8d4e240f6ae50d9b22ddc44f5e207018935da907.tar.bz2 luasocket-8d4e240f6ae50d9b22ddc44f5e207018935da907.zip | |
Forward server working on Mac OS X...
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 | ||
