summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--io.c12
-rw-r--r--test/ruby/test_io.rb12
3 files changed, 32 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index fdb52a2da3..83ea9eac71 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sat Nov 12 11:06:02 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (ioctl_req_t): Type of req argument of ioctl() depend on platform.
+ Moreover almost all linux ioctl can't be represented by 32bit integer
+ (i.e. MSB is 1). We need wrap ioctl argument type.
+ [Bug #5429] [ruby-dev:44589]
+ * io.c (struct ioctl_arg): ditto.
+ * io.c (rb_ioctl): ditto.
+ * test/ruby/test_io.rb (test_ioctl_linux): add a testcase for ioctl
+
Sat Nov 12 11:00:42 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* io.c (struct io_cntl_arg): remove io_p member.
diff --git a/io.c b/io.c
index e283613848..d0aceb2c89 100644
--- a/io.c
+++ b/io.c
@@ -7860,9 +7860,17 @@ rb_f_select(int argc, VALUE *argv, VALUE obj)
return rb_ensure(select_call, (VALUE)&args, select_end, (VALUE)&args);
}
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
+ typedef unsigned long ioctl_req_t;
+ #define NUM2IOCTLREQ(num) NUM2ULONG(num)
+#else
+ typedef int ioctl_req_t;
+ #define NUM2IOCTLREQ(num) NUM2INT(num)
+#endif
+
struct ioctl_arg {
int fd;
- int cmd;
+ ioctl_req_t cmd;
long narg;
};
@@ -7954,7 +7962,7 @@ setup_narg(int cmd, VALUE *argp, int io_p)
static VALUE
rb_ioctl(VALUE io, VALUE req, VALUE arg)
{
- int cmd = NUM2INT(req);
+ int cmd = NUM2IOCTLREQ(req);
rb_io_t *fptr;
long narg;
int retval;
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index e4af5e0e9f..f7670a1293 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -2055,4 +2055,16 @@ End
assert(w.close_on_exec?)
}
end
+
+ def test_ioctl_linux
+ return if /linux/ !~ RUBY_PLATFORM
+
+ assert_nothing_raised do
+ File.open('/dev/urandom'){|f1|
+ entropy_count = ""
+ # get entropy count
+ f1.ioctl(0x80045200, entropy_count)
+ }
+ end
+ end
end