summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/util.c b/util.c
index 95268b4..ab9afcc 100644
--- a/util.c
+++ b/util.c
@@ -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;