-------------------------------------------------------------------------*\ * Recvfrom with timeout \*-------------------------------------------------------------------------*/
| 278 | * Recvfrom with timeout |
| 279 | \*-------------------------------------------------------------------------*/ |
| 280 | int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, |
| 281 | SA *addr, socklen_t *len, p_timeout tm) { |
| 282 | int err; |
| 283 | *got = 0; |
| 284 | if (*ps == SOCKET_INVALID) return IO_CLOSED; |
| 285 | for ( ;; ) { |
| 286 | long taken = (long) recvfrom(*ps, data, count, 0, addr, len); |
| 287 | if (taken > 0) { |
| 288 | *got = taken; |
| 289 | return IO_DONE; |
| 290 | } |
| 291 | err = errno; |
| 292 | if (taken == 0) return IO_CLOSED; |
| 293 | if (err == EINTR) continue; |
| 294 | if (err != EAGAIN) return err; |
| 295 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
| 296 | } |
| 297 | return IO_UNKNOWN; |
| 298 | } |
| 299 | |
| 300 | |
| 301 | /*-------------------------------------------------------------------------*\ |
no test coverage detected