diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -45,6 +45,41 @@ int fd_can_read (int fd) return 0; } +ssize_t read_with_timeout (int fd, void *_b, size_t len, unsigned timeout) +{ + struct timeval tv = {0}; + unsigned char *b = _b; + fd_set rfds; + ssize_t red, ret = 0; + + tv.tv_sec = timeout / 10; + tv.tv_usec = (timeout % 10) * 100000; + + while (tv.tv_sec || tv.tv_usec) { + FD_ZERO (&rfds); + FD_SET (fd, &rfds); + + if (select (fd + 1, &rfds, NULL, NULL, &tv) == 1) { + + red = read (fd, &b[ret], 1); + + if (red == 1) + ret++; + + if (red <= 0) { + if (ret) return ret; + + return red; + } + + if (ret == len) return ret; + + } + } + + return ret; +} + int fd_drain (int fd) { char c; |