diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-11-12 02:09:56 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-11-12 02:09:56 +0000 |
commit | eec252e2e520ed1297df6ca8deb089f29e384e2c (patch) | |
tree | f4684b52dcd8a16dec979d582a72145beb341d81 /io.c | |
parent | 6ed2a4dfb3ffcb2191314a23e45f39075eb4bf6a (diff) | |
download | ruby-eec252e2e520ed1297df6ca8deb089f29e384e2c.tar.gz |
* io.c (+setup_narg): factor out length calculation logic.
* io.c (rb_io_ctl): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 33 |
1 files changed, 22 insertions, 11 deletions
@@ -7928,16 +7928,11 @@ ioctl_narg_len(int cmd) return len; } -static VALUE -rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p) +static long +setup_narg(int cmd, VALUE *argp, int io_p) { - int cmd = NUM2INT(req); - rb_io_t *fptr; - long len = 0; long narg = 0; - int retval; - - rb_secure(2); + VALUE arg = *argp; if (NIL_P(arg) || arg == Qfalse) { narg = 0; @@ -7955,10 +7950,11 @@ rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p) narg = NUM2LONG(arg); } else { - arg = tmp; + long len; + *argp = arg = tmp; if (io_p) - ioctl_narg_len(cmd); + len = ioctl_narg_len(cmd); else len = 256; rb_str_modify(arg); @@ -7973,10 +7969,25 @@ rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p) narg = (long)(SIGNED_VALUE)RSTRING_PTR(arg); } } + + return narg; +} + +static VALUE +rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p) +{ + int cmd = NUM2INT(req); + rb_io_t *fptr; + long narg; + int retval; + + rb_secure(2); + + narg = setup_narg(cmd, &arg, io_p); GetOpenFile(io, fptr); retval = io_cntl(fptr->fd, cmd, narg, io_p); if (retval < 0) rb_sys_fail_path(fptr->pathv); - if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[len] != 17) { + if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) { rb_raise(rb_eArgError, "return value overflowed string"); } |