зеркало из https://github.com/github/ruby.git
* 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 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33716 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
fc7bb927a2
Коммит
7e2f0491ce
10
ChangeLog
10
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.
|
||||
|
|
12
io.c
12
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;
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче