Clean up io_input() for the "no input available" case

Return zero when no input is available, regardless of parameter
waitforinput.  Before, it returned -1 with errno set to EAGAIN or
EWOULDBLOCK when not waiting for input.  Current callers all wait.

Drop errno from the function's contract, for consistency with
io_output().
This commit is contained in:
Markus Armbruster 2012-03-10 11:13:08 +01:00
parent 5501efa278
commit 0513ec136b

View file

@ -128,9 +128,8 @@ io_close(struct iop *iop)
/* /*
* Return number of bytes read on success, zero on timeout, early * Return number of bytes read on success, zero on timeout, early
* wakeup or EOF, -1 on error, with errno set appropriately. In * wakeup or EOF, -1 on error. In particular, return 0 when no data
* particular, return -1 with errno set to EAGAIN or EWOULDBLOCK when * is available for non-blocking input (WAITFORINPUT false).
* no data is available for non-blocking input (WAITFORINPUT false).
* Use io_eof() to distinguish timeout and early wakeup from EOF. * Use io_eof() to distinguish timeout and early wakeup from EOF.
*/ */
int int
@ -140,14 +139,10 @@ io_input(struct iop *iop, int waitforinput)
int cc; int cc;
int res; int res;
if ((iop->flags & IO_READ) == 0) { if ((iop->flags & IO_READ) == 0)
errno = EBADF;
return -1; return -1;
} if (iop->flags & IO_ERROR)
if (iop->flags & IO_ERROR) {
errno = EBADF;
return -1; return -1;
}
if (iop->flags & IO_EOF) if (iop->flags & IO_EOF)
return 0; return 0;
@ -164,8 +159,8 @@ io_input(struct iop *iop, int waitforinput)
/* Do the actual read. */ /* Do the actual read. */
cc = read(iop->fd, buf, sizeof(buf)); cc = read(iop->fd, buf, sizeof(buf));
if (cc < 0) { if (cc < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) if (errno == EAGAIN || errno == EWOULDBLOCK)
/* Some form of file error occurred... */ return 0;
iop->flags |= IO_ERROR; iop->flags |= IO_ERROR;
return -1; return -1;
} }