Provide a flag to return RES_ERROR even on signal (EINTR); without it, retry the operation

This commit is contained in:
Paul LeoNerd Evans
2011-08-25 10:48:41 +01:00
parent 7a2b79a640
commit 1b8234e342
5 changed files with 19 additions and 5 deletions

View File

@@ -841,12 +841,17 @@ TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key)
struct pollfd fd;
retry:
fd.fd = tk->fd;
fd.events = POLLIN;
int pollret = poll(&fd, 1, tk->waittime);
if(pollret == -1)
if(pollret == -1) {
if(errno == EINTR && !(tk->flags & TERMKEY_FLAG_EINTR))
goto retry;
return TERMKEY_RES_ERROR;
}
if(fd.revents & (POLLIN|POLLHUP|POLLERR))
ret = termkey_advisereadable(tk);
@@ -884,11 +889,16 @@ void termkey_pushinput(TermKey *tk, const unsigned char *input, size_t inputlen)
TermKeyResult termkey_advisereadable(TermKey *tk)
{
unsigned char buffer[64]; // Smaller than the default size
ssize_t len = read(tk->fd, buffer, sizeof buffer);
ssize_t len;
retry:
len = read(tk->fd, buffer, sizeof buffer);
if(len == -1) {
if(errno == EAGAIN)
return TERMKEY_RES_NONE;
else if(errno == EINTR && !(tk->flags & TERMKEY_FLAG_EINTR))
goto retry;
else
return TERMKEY_RES_ERROR;
}