diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2007-06-11 23:44:54 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2007-06-11 23:44:54 +0000 |
| commit | 3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a (patch) | |
| tree | f0c49eb250f5375414025a9e7022261e729ad905 /src/usocket.c | |
| parent | 3074a8f56b5153f4477e662453102583d7b6f539 (diff) | |
| download | luasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.tar.gz luasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.tar.bz2 luasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.zip | |
Crashy bug fixed in recvraw.
Also fixed returns on closed socket.
Diffstat (limited to 'src/usocket.c')
| -rw-r--r-- | src/usocket.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/usocket.c b/src/usocket.c index e70806a..ef275b4 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
| @@ -206,10 +206,10 @@ int socket_send(p_socket ps, const char *data, size_t count, | |||
| 206 | size_t *sent, p_timeout tm) | 206 | size_t *sent, p_timeout tm) |
| 207 | { | 207 | { |
| 208 | int err; | 208 | int err; |
| 209 | *sent = 0; | ||
| 209 | /* avoid making system calls on closed sockets */ | 210 | /* avoid making system calls on closed sockets */ |
| 210 | if (*ps == SOCKET_INVALID) return IO_CLOSED; | 211 | if (*ps == SOCKET_INVALID) return IO_CLOSED; |
| 211 | /* loop until we send something or we give up on error */ | 212 | /* loop until we send something or we give up on error */ |
| 212 | *sent = 0; | ||
| 213 | for ( ;; ) { | 213 | for ( ;; ) { |
| 214 | long put = (long) send(*ps, data, count, 0); | 214 | long put = (long) send(*ps, data, count, 0); |
| 215 | /* if we sent anything, we are done */ | 215 | /* if we sent anything, we are done */ |
| @@ -239,8 +239,8 @@ int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, | |||
| 239 | SA *addr, socklen_t len, p_timeout tm) | 239 | SA *addr, socklen_t len, p_timeout tm) |
| 240 | { | 240 | { |
| 241 | int err; | 241 | int err; |
| 242 | if (*ps == SOCKET_INVALID) return IO_CLOSED; | ||
| 243 | *sent = 0; | 242 | *sent = 0; |
| 243 | if (*ps == SOCKET_INVALID) return IO_CLOSED; | ||
| 244 | for ( ;; ) { | 244 | for ( ;; ) { |
| 245 | long put = (long) sendto(*ps, data, count, 0, addr, len); | 245 | long put = (long) sendto(*ps, data, count, 0, addr, len); |
| 246 | if (put > 0) { | 246 | if (put > 0) { |
| @@ -261,6 +261,7 @@ int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, | |||
| 261 | \*-------------------------------------------------------------------------*/ | 261 | \*-------------------------------------------------------------------------*/ |
| 262 | int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) { | 262 | int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) { |
| 263 | int err; | 263 | int err; |
| 264 | *got = 0; | ||
| 264 | if (*ps == SOCKET_INVALID) return IO_CLOSED; | 265 | if (*ps == SOCKET_INVALID) return IO_CLOSED; |
| 265 | for ( ;; ) { | 266 | for ( ;; ) { |
| 266 | long taken = (long) recv(*ps, data, count, 0); | 267 | long taken = (long) recv(*ps, data, count, 0); |
| @@ -269,7 +270,6 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm | |||
| 269 | return IO_DONE; | 270 | return IO_DONE; |
| 270 | } | 271 | } |
| 271 | err = errno; | 272 | err = errno; |
| 272 | *got = 0; | ||
| 273 | if (taken == 0) return IO_CLOSED; | 273 | if (taken == 0) return IO_CLOSED; |
| 274 | if (err == EINTR) continue; | 274 | if (err == EINTR) continue; |
| 275 | if (err != EAGAIN) return err; | 275 | if (err != EAGAIN) return err; |
| @@ -284,6 +284,7 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm | |||
| 284 | int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, | 284 | int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, |
| 285 | SA *addr, socklen_t *len, p_timeout tm) { | 285 | SA *addr, socklen_t *len, p_timeout tm) { |
| 286 | int err; | 286 | int err; |
| 287 | *got = 0; | ||
| 287 | if (*ps == SOCKET_INVALID) return IO_CLOSED; | 288 | if (*ps == SOCKET_INVALID) return IO_CLOSED; |
| 288 | for ( ;; ) { | 289 | for ( ;; ) { |
| 289 | long taken = (long) recvfrom(*ps, data, count, 0, addr, len); | 290 | long taken = (long) recvfrom(*ps, data, count, 0, addr, len); |
| @@ -292,7 +293,6 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, | |||
| 292 | return IO_DONE; | 293 | return IO_DONE; |
| 293 | } | 294 | } |
| 294 | err = errno; | 295 | err = errno; |
| 295 | *got = 0; | ||
| 296 | if (taken == 0) return IO_CLOSED; | 296 | if (taken == 0) return IO_CLOSED; |
| 297 | if (err == EINTR) continue; | 297 | if (err == EINTR) continue; |
| 298 | if (err != EAGAIN) return err; | 298 | if (err != EAGAIN) return err; |
