diff options
Diffstat (limited to 'src/wsocket.c')
| -rw-r--r-- | src/wsocket.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/src/wsocket.c b/src/wsocket.c index af3f8d8..023f470 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
| @@ -207,9 +207,9 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, | |||
| 207 | FD_ZERO(&fds); | 207 | FD_ZERO(&fds); |
| 208 | FD_SET(sock, &fds); | 208 | FD_SET(sock, &fds); |
| 209 | ret = sock_select(0, NULL, &fds, NULL, timeout); | 209 | ret = sock_select(0, NULL, &fds, NULL, timeout); |
| 210 | /* tell the caller to call us again because there is more data */ | 210 | /* tell the caller to call us again because now we can send */ |
| 211 | if (ret > 0) return IO_DONE; | 211 | if (ret > 0) return IO_RETRY; |
| 212 | /* tell the caller there was no data before timeout */ | 212 | /* tell the caller we can't send anything before timint out */ |
| 213 | else return IO_TIMEOUT; | 213 | else return IO_TIMEOUT; |
| 214 | /* here we know the connection has been closed */ | 214 | /* here we know the connection has been closed */ |
| 215 | } else return IO_CLOSED; | 215 | } else return IO_CLOSED; |
| @@ -229,27 +229,18 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
| 229 | t_sock sock = *ps; | 229 | t_sock sock = *ps; |
| 230 | int put; | 230 | int put; |
| 231 | int ret; | 231 | int ret; |
| 232 | /* avoid making system calls on closed sockets */ | ||
| 233 | if (sock == SOCK_INVALID) return IO_CLOSED; | 232 | if (sock == SOCK_INVALID) return IO_CLOSED; |
| 234 | /* try to send something */ | ||
| 235 | put = sendto(sock, data, (int) count, 0, addr, addr_len); | 233 | put = sendto(sock, data, (int) count, 0, addr, addr_len); |
| 236 | /* deal with failure */ | ||
| 237 | if (put <= 0) { | 234 | if (put <= 0) { |
| 238 | /* in any case, nothing has been sent */ | ||
| 239 | *sent = 0; | 235 | *sent = 0; |
| 240 | /* run select to avoid busy wait */ | ||
| 241 | if (WSAGetLastError() == WSAEWOULDBLOCK) { | 236 | if (WSAGetLastError() == WSAEWOULDBLOCK) { |
| 242 | fd_set fds; | 237 | fd_set fds; |
| 243 | FD_ZERO(&fds); | 238 | FD_ZERO(&fds); |
| 244 | FD_SET(sock, &fds); | 239 | FD_SET(sock, &fds); |
| 245 | ret = sock_select(0, NULL, &fds, NULL, timeout); | 240 | ret = sock_select(0, NULL, &fds, NULL, timeout); |
| 246 | /* tell the caller to call us again because there is more data */ | 241 | if (ret > 0) return IO_RETRY; |
| 247 | if (ret > 0) return IO_DONE; | ||
| 248 | /* tell the caller there was no data before timeout */ | ||
| 249 | else return IO_TIMEOUT; | 242 | else return IO_TIMEOUT; |
| 250 | /* here we know the connection has been closed */ | ||
| 251 | } else return IO_CLOSED; | 243 | } else return IO_CLOSED; |
| 252 | /* here we successfully sent something */ | ||
| 253 | } else { | 244 | } else { |
| 254 | *sent = put; | 245 | *sent = put; |
| 255 | return IO_DONE; | 246 | return IO_DONE; |
| @@ -273,7 +264,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) | |||
| 273 | FD_ZERO(&fds); | 264 | FD_ZERO(&fds); |
| 274 | FD_SET(sock, &fds); | 265 | FD_SET(sock, &fds); |
| 275 | ret = sock_select(0, &fds, NULL, NULL, timeout); | 266 | ret = sock_select(0, &fds, NULL, NULL, timeout); |
| 276 | if (ret > 0) return IO_DONE; | 267 | if (ret > 0) return IO_RETRY; |
| 277 | else return IO_TIMEOUT; | 268 | else return IO_TIMEOUT; |
| 278 | } else { | 269 | } else { |
| 279 | *got = taken; | 270 | *got = taken; |
| @@ -299,7 +290,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
| 299 | FD_ZERO(&fds); | 290 | FD_ZERO(&fds); |
| 300 | FD_SET(sock, &fds); | 291 | FD_SET(sock, &fds); |
| 301 | ret = sock_select(0, &fds, NULL, NULL, timeout); | 292 | ret = sock_select(0, &fds, NULL, NULL, timeout); |
| 302 | if (ret > 0) return IO_DONE; | 293 | if (ret > 0) return IO_RETRY; |
| 303 | else return IO_TIMEOUT; | 294 | else return IO_TIMEOUT; |
| 304 | } else { | 295 | } else { |
| 305 | *got = taken; | 296 | *got = taken; |
