From 44c24d4416a9c3f36010dcf0593e5dce21183d19 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 16 Feb 2013 03:46:34 +0000 Subject: [PATCH] io/console: compatibility with 1.9 * ext/io/console/console.c (rawmode_opt, console_dev): compatibility with ruby 1.9. [ruby-core:52220] [Bug #7847] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39268 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/io/console/console.c | 37 +++++++++++++++++++++++++++++++++++++ ext/io/console/extconf.rb | 7 ++++--- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index f9fca45677..3c75674fca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Feb 16 12:46:32 2013 Nobuyoshi Nakada + + * ext/io/console/console.c (rawmode_opt, console_dev): compatibility + with ruby 1.9. [ruby-core:52220] [Bug #7847] + Sat Feb 16 12:45:50 2013 Nobuyoshi Nakada * configure.in: unexpand arch sitearch and exec_prefix values, so 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 #endif +#ifndef RB_TYPE_P +#define RB_TYPE_P(obj, type) (TYPE(obj) == type) +#endif + #if defined HAVE_TERMIOS_H # include 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 -> # 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