summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-02-16 03:46:34 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-02-16 03:46:34 +0000
commit44c24d4416a9c3f36010dcf0593e5dce21183d19 (patch)
tree6abfc75332bd190d657337cf0ab2cc340886ebb0
parent62711da25352ac195013e0b81cd6343f8f39b9b5 (diff)
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
-rw-r--r--ChangeLog5
-rw-r--r--ext/io/console/console.c37
-rw-r--r--ext/io/console/extconf.rb7
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 <nobu@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* 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 <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