+/* Read all available data from the stream and empty the read buffer. */
+int tio_skipall(TFILE *fp)
+{
+ struct pollfd fds[1];
+ int rv;
+ size_t len;
+ /* clear the read buffer */
+ fp->readbuffer.start=0;
+ fp->readbuffer.len=0;
+ fp->read_resettable=0;
+ /* read until we can't read no more */
+ len=fp->readbuffer.size;
+#ifdef SSIZE_MAX
+ if (len>SSIZE_MAX)
+ len=SSIZE_MAX;
+#endif /* SSIZE_MAX */
+ while (1)
+ {
+ /* see if any data is available */
+ fds[0].fd=fp->fd;
+ fds[0].events=POLLIN;
+ rv=poll(fds,1,0);
+ /* check the poll() result */
+ if (rv==0)
+ return 0; /* no file descriptor ready */
+ if ((rv<0)&&((errno==EINTR)||(errno==EAGAIN)))
+ continue; /* interrupted, try again */
+ if (rv<0)
+ return -1; /* something went wrong */
+ /* read data from the stream */
+ rv=read(fp->fd,fp->readbuffer.buffer,len);
+ if (rv==0)
+ return 0; /* end-of-file */
+ if ((rv<0)&&(errno==EWOULDBLOCK))
+ return 0; /* we've ready everything we can without blocking */
+ if ((rv<0)&&(errno!=EINTR)&&(errno!=EAGAIN))
+ return -1; /* something went wrong with the read */
+ }
+}
+