diff options
Diffstat (limited to 'ext/io/console')
-rw-r--r-- | ext/io/console/console.c | 37 | ||||
-rw-r--r-- | ext/io/console/extconf.rb | 7 |
2 files changed, 41 insertions, 3 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c index cab8207ce7..6c7a31b5e0 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -23,6 +23,10 @@ typedef OpenFile rb_io_t; #include <sys/ioctl.h> #endif +#ifndef RB_TYPE_P +#define RB_TYPE_P(obj, type) (TYPE(obj) == type) +#endif + #if defined HAVE_TERMIOS_H # include <termios.h> typedef struct termios conmode; @@ -101,7 +105,23 @@ rawmode_opt(int argc, VALUE *argv, rawmode_arg_t *opts) { rawmode_arg_t *optp = NULL; VALUE vopts; +#ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH rb_scan_args(argc, argv, "0:", &vopts); +#else + vopts = Qnil; + if (argc > 0) { + vopts = argv[--argc]; + if (!NIL_P(vopts)) { +# ifdef HAVE_RB_CHECK_HASH_TYPE + vopts = rb_check_hash_type(vopts); + if (NIL_P(vopts)) ++argc; +# else + Check_Type(vopts, T_HASH); +# endif + } + } + rb_scan_args(argc, argv, "0"); +#endif if (!NIL_P(vopts)) { VALUE vmin = rb_hash_aref(vopts, ID2SYM(rb_intern("min"))); VALUE vtime = rb_hash_aref(vopts, ID2SYM(rb_intern("time"))); @@ -644,6 +664,23 @@ console_ioflush(VALUE io) return io; } +#ifndef HAVE_RB_CLOEXEC_OPEN +static int +rb_cloexec_open(const char *pathname, int flags, mode_t mode) +{ + int ret; +#ifdef O_CLOEXEC + /* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */ + flags |= O_CLOEXEC; +#elif defined O_NOINHERIT + flags |= O_NOINHERIT; +#endif + return open(pathname, flags, mode); +} + +#define rb_update_max_fd(fd) (void)(fd) +#endif + /* * call-seq: * IO.console -> #<File:/dev/tty> diff --git a/ext/io/console/extconf.rb b/ext/io/console/extconf.rb index 57cd7ad87f..918f86b27f 100644 --- a/ext/io/console/extconf.rb +++ b/ext/io/console/extconf.rb @@ -12,9 +12,10 @@ when have_header(hdr = "sgtty.h") else ok = false end -have_header("sys/ioctl.h") -have_func("rb_io_get_write_io", "ruby/io.h") -have_func("dup3", "unistd.h") if ok + have_header("sys/ioctl.h") + have_func("rb_check_hash_type", "ruby.h") + have_func("rb_io_get_write_io", "ruby/io.h") + have_func("rb_cloexec_open", "ruby/io.h") create_makefile("io/console") end |