Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more
Returns number of bytes that can be read without blocking. Returns zero if no information available.
static VALUE io_nread(VALUE io) { rb_io_t *fptr; int len; ioctl_arg n; GetOpenFile(io, fptr); rb_io_check_readable(fptr); len = rb_io_read_pending(fptr); if (len > 0) return len; if (!FIONREAD_POSSIBLE_P(fptr->fd)) return INT2FIX(0); if (ioctl(fptr->fd, FIONREAD, &n)) return INT2FIX(0); if (n > 0) return ioctl_arg2num(n); return INT2FIX(0); }
Returns true if input available without blocking, or false. Returns nil if no information available.
static VALUE io_ready_p(VALUE io) { rb_io_t *fptr; ioctl_arg n; GetOpenFile(io, fptr); rb_io_check_readable(fptr); if (rb_io_read_pending(fptr)) return Qtrue; if (!FIONREAD_POSSIBLE_P(fptr->fd)) return Qnil; if (ioctl(fptr->fd, FIONREAD, &n)) return Qnil; if (n > 0) return Qtrue; return Qfalse; }
Waits until input is available or times out and returns self or nil when EOF is reached.
static VALUE io_wait(int argc, VALUE *argv, VALUE io) { rb_io_t *fptr; struct wait_readable_arg arg; int fd, i; ioctl_arg n; VALUE timeout; struct timeval timerec; GetOpenFile(io, fptr); rb_io_check_readable(fptr); rb_scan_args(argc, argv, "01", &timeout); if (NIL_P(timeout)) { arg.timeout = 0; } else { timerec = rb_time_interval(timeout); arg.timeout = &timerec; } if (rb_io_read_pending(fptr)) return Qtrue; if (!FIONREAD_POSSIBLE_P(fptr->fd)) return Qfalse; fd = fptr->fd; rb_fd_init(&arg.fds); rb_fd_set(fd, &arg.fds); #ifdef HAVE_RB_FD_INIT i = (int)rb_ensure(wait_readable, (VALUE)&arg, (VALUE (*)_((VALUE)))rb_fd_term, (VALUE)&arg.fds); #else i = rb_thread_select(fd + 1, rb_fd_ptr(&arg.fds), NULL, NULL, arg.timeout); #endif if (i < 0) rb_sys_fail(0); rb_io_check_closed(fptr); if (ioctl(fptr->fd, FIONREAD, &n)) rb_sys_fail(0); if (n > 0) return io; return Qnil; }