1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/io/wait: imported.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4124 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2003-07-23 09:26:53 +00:00
parent 2436525ed8
commit eb5a52e070
5 changed files with 165 additions and 0 deletions

View file

@ -1,3 +1,7 @@
Wed Jul 23 18:21:52 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* ext/io/wait: imported.
Wed Jul 23 15:49:01 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* string.c (rb_str_lstrip_bang): strip NUL along with white

4
ext/io/wait/MANIFEST Normal file
View file

@ -0,0 +1,4 @@
MANIFEST
extconf.rb
wait.c
lib/nonblock.rb

28
ext/io/wait/extconf.rb Normal file
View file

@ -0,0 +1,28 @@
require 'mkmf'
target = "io/wait"
unless defined?(checking_for)
def checking_for(msg)
STDOUT.print "checking for ", msg, "..."
STDOUT.flush
STDOUT.puts((r = yield) ? "yes" : "no")
r
end
end
unless defined?(macro_defined?)
def macro_defined?(macro, src, opt="")
try_cpp(src + <<"SRC", opt)
#ifndef #{macro}
# error
#endif
SRC
end
end
unless /djgpp|mswin|mingw|human/ =~ RUBY_PLATFORM
fionread = %w[sys/ioctl.h sys/filio.h].find do |h|
checking_for("FIONREAD") {macro_defined?("FIONREAD", "#include <#{h}>\n")}
end
exit 1 unless fionread
$defs << "-DFIONREAD_HEADER=\"<#{fionread}>\""
create_makefile(target)
end

View file

@ -0,0 +1,23 @@
require "fcntl"
class IO
def nonblock?
(fcntl(Fcntl::F_GETFL) & File::NONBLOCK) != 0
end
def nonblock=(nb)
f = fcntl(Fcntl::F_GETFL)
if nb
f |= File::NONBLOCK
else
f &= ~File::NONBLOCK
end
fcntl(Fcntl::F_SETFL, f)
end
def nonblock(nb = true)
nb, self.nonblock = nonblock?, nb
yield
ensure
self.nonblock = nb
end
end

106
ext/io/wait/wait.c Normal file
View file

@ -0,0 +1,106 @@
/**********************************************************************
io/wait.c -
$Author$
$Date$
created at: Tue Aug 28 09:08:06 JST 2001
All the files in this distribution are covered under the Ruby's
license (see the file COPYING).
**********************************************************************/
#include "ruby.h"
#include "rubyio.h"
#include <sys/types.h>
#include FIONREAD_HEADER
static VALUE io_ready_p _((VALUE io));
static VALUE io_wait _((int argc, VALUE *argv, VALUE io));
void Init_wait _((void));
EXTERN struct timeval rb_time_interval _((VALUE time));
/*
=begin
= IO wait methods.
=end
*/
/*
=begin
--- IO#ready?
returns non-nil if input available without blocking, or nil.
=end
*/
static VALUE
io_ready_p(io)
VALUE io;
{
OpenFile *fptr;
FILE *fp;
int n;
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
fp = fptr->f;
if (feof(fp)) return Qfalse;
if (rb_read_pending(fp)) return Qtrue;
if (ioctl(fileno(fp), FIONREAD, &n)) rb_sys_fail(0);
if (n > 0) return INT2NUM(n);
return Qnil;
}
/*
=begin
--- IO#wait([timeout])
waits until input available or timed out and returns self, or nil
when EOF reached.
=end
*/
static VALUE
io_wait(argc, argv, io)
int argc;
VALUE *argv;
VALUE io;
{
OpenFile *fptr;
fd_set rd;
FILE *fp;
int fd, n;
VALUE timeout;
struct timeval *tp, timerec;
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
rb_scan_args(argc, argv, "01", &timeout);
if (NIL_P(timeout)) {
tp = 0;
}
else {
timerec = rb_time_interval(timeout);
tp = &timerec;
}
fp = fptr->f;
if (feof(fp)) return Qfalse;
if (rb_read_pending(fp)) return Qtrue;
fd = fileno(fp);
FD_ZERO(&rd);
FD_SET(fd, &rd);
if (rb_thread_select(fd + 1, &rd, NULL, NULL, tp) < 0)
rb_sys_fail(0);
rb_io_check_closed(fptr);
if (ioctl(fileno(fp), FIONREAD, &n)) rb_sys_fail(0);
if (n > 0) return io;
return Qnil;
}
void
Init_wait()
{
rb_define_method(rb_cIO, "ready?", io_ready_p, 0);
rb_define_method(rb_cIO, "wait", io_wait, -1);
}