summaryrefslogtreecommitdiff
path: root/libbb/read_key.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/read_key.c')
-rw-r--r--libbb/read_key.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/libbb/read_key.c b/libbb/read_key.c
index 03b7da6..829ae21 100644
--- a/libbb/read_key.c
+++ b/libbb/read_key.c
@@ -126,7 +126,10 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
* if fd can be in non-blocking mode.
*/
if (timeout >= -1) {
- if (safe_poll(&pfd, 1, timeout) == 0) {
+ n = poll(&pfd, 1, timeout);
+ if (n < 0 && errno == EINTR)
+ return n;
+ if (n == 0) {
/* Timed out */
errno = EAGAIN;
return -1;
@@ -138,7 +141,7 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
* When we were reading 3 bytes here, we were eating
* "li" too, and cat was getting wrong input.
*/
- n = safe_read(fd, buffer, 1);
+ n = read(fd, buffer, 1);
if (n <= 0)
return -1;
}
@@ -284,6 +287,15 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
goto start_over;
}
+int64_t FAST_FUNC safe_read_key(int fd, char *buffer, int timeout)
+{
+ int64_t r;
+ do {
+ r = read_key(fd, buffer, timeout);
+ } while (errno == EINTR);
+ return r;
+}
+
void FAST_FUNC read_key_ungets(char *buffer, const char *str, unsigned len)
{
unsigned cur_len = (unsigned char)buffer[0];