From 7a2b79a6402979b4895e78657d59a770d5b082b3 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Thu, 18 Aug 2011 11:20:41 +0100 Subject: Provide a new result value, TERMKEY_RES_ERROR to indicate an IO error - preserve errno --- termkey.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'termkey.c') diff --git a/termkey.c b/termkey.c index 60d76e8..dd1020b 100644 --- a/termkey.c +++ b/termkey.c @@ -607,6 +607,7 @@ static TermKeyResult peekkey(TermKey *tk, TermKeyKey *key, int force, size_t *nb /* fallthrough */ case TERMKEY_RES_EOF: + case TERMKEY_RES_ERROR: return ret; case TERMKEY_RES_AGAIN: @@ -673,6 +674,7 @@ static TermKeyResult peekkey_simple(TermKey *tk, TermKeyKey *key, int force, siz case TERMKEY_RES_NONE: case TERMKEY_RES_EOF: case TERMKEY_RES_AGAIN: + case TERMKEY_RES_ERROR: break; } @@ -821,10 +823,13 @@ TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key) switch(ret) { case TERMKEY_RES_KEY: case TERMKEY_RES_EOF: + case TERMKEY_RES_ERROR: return ret; case TERMKEY_RES_NONE: - termkey_advisereadable(tk); + ret = termkey_advisereadable(tk); + if(ret == TERMKEY_RES_ERROR) + return ret; break; case TERMKEY_RES_AGAIN: @@ -839,13 +844,17 @@ TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key) fd.fd = tk->fd; fd.events = POLLIN; - poll(&fd, 1, tk->waittime); + int pollret = poll(&fd, 1, tk->waittime); + if(pollret == -1) + return TERMKEY_RES_ERROR; if(fd.revents & (POLLIN|POLLHUP|POLLERR)) ret = termkey_advisereadable(tk); else ret = TERMKEY_RES_NONE; + if(ret == TERMKEY_RES_ERROR) + return ret; if(ret == TERMKEY_RES_NONE) return termkey_getkey_force(tk, key); } @@ -877,8 +886,12 @@ TermKeyResult termkey_advisereadable(TermKey *tk) unsigned char buffer[64]; // Smaller than the default size ssize_t len = read(tk->fd, buffer, sizeof buffer); - if(len == -1 && (errno == EAGAIN || errno == EINTR)) - return TERMKEY_RES_NONE; + if(len == -1) { + if(errno == EAGAIN) + return TERMKEY_RES_NONE; + else + return TERMKEY_RES_ERROR; + } else if(len < 1) { tk->is_closed = 1; return TERMKEY_RES_NONE; -- cgit v1.2.3