From b11ae5cf86000bfce35b6ec511014d8f6b04416e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 26 Oct 2020 22:55:18 +0000 Subject: add keypad --- util.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'util.c') 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; -- cgit v1.2.3