summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-10-23 12:21:50 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-12-21 13:34:04 +0900
commitc29c2afafe5bc550090959af24e7fbedd8e002e9 (patch)
tree5b54dd9da546d08f726630906c8749414f2e3b5d
parent02a9a72f436c17ce22b990af6379356b331a3039 (diff)
Refactor setup_narg and extract finish_narg
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5020
-rw-r--r--io.c59
1 files changed, 27 insertions, 32 deletions
diff --git a/io.c b/io.c
index da97102b56..dc883f36b4 100644
--- a/io.c
+++ b/io.c
@@ -10092,7 +10092,7 @@ typedef int fcntl_arg_t;
#endif
static long
-fcntl_narg_len(int cmd)
+fcntl_narg_len(ioctl_req_t cmd)
{
long len;
@@ -10212,19 +10212,21 @@ fcntl_narg_len(int cmd)
}
#else /* HAVE_FCNTL */
static long
-fcntl_narg_len(int cmd)
+fcntl_narg_len(ioctl_req_t cmd)
{
return 0;
}
#endif /* HAVE_FCNTL */
+#define NARG_SENTINEL 17
+
static long
-setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
+setup_narg(ioctl_req_t cmd, VALUE *argp, long (*narg_len)(ioctl_req_t))
{
long narg = 0;
VALUE arg = *argp;
- if (NIL_P(arg) || arg == Qfalse) {
+ if (!RTEST(arg)) {
narg = 0;
}
else if (FIXNUM_P(arg)) {
@@ -10244,10 +10246,7 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
long len, slen;
*argp = arg = tmp;
- if (io_p)
- len = ioctl_narg_len(cmd);
- else
- len = fcntl_narg_len((int)cmd);
+ len = narg_len(cmd);
rb_str_modify(arg);
slen = RSTRING_LEN(arg);
@@ -10259,7 +10258,7 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
}
/* a little sanity check here */
ptr = RSTRING_PTR(arg);
- ptr[slen - 1] = 17;
+ ptr[slen - 1] = NARG_SENTINEL;
narg = (long)(SIGNED_VALUE)ptr;
}
}
@@ -10267,24 +10266,15 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
return narg;
}
-#ifdef HAVE_IOCTL
static VALUE
-rb_ioctl(VALUE io, VALUE req, VALUE arg)
+finish_narg(int retval, VALUE arg, const rb_io_t *fptr)
{
- ioctl_req_t cmd = NUM2IOCTLREQ(req);
- rb_io_t *fptr;
- long narg;
- int retval;
-
- narg = setup_narg(cmd, &arg, 1);
- GetOpenFile(io, fptr);
- retval = do_ioctl(fptr->fd, cmd, narg);
if (retval < 0) rb_sys_fail_path(fptr->pathv);
if (RB_TYPE_P(arg, T_STRING)) {
char *ptr;
long slen;
RSTRING_GETMEM(arg, ptr, slen);
- if (ptr[slen-1] != 17)
+ if (ptr[slen-1] != NARG_SENTINEL)
rb_raise(rb_eArgError, "return value overflowed string");
ptr[slen-1] = '\0';
}
@@ -10292,6 +10282,21 @@ rb_ioctl(VALUE io, VALUE req, VALUE arg)
return INT2NUM(retval);
}
+#ifdef HAVE_IOCTL
+static VALUE
+rb_ioctl(VALUE io, VALUE req, VALUE arg)
+{
+ ioctl_req_t cmd = NUM2IOCTLREQ(req);
+ rb_io_t *fptr;
+ long narg;
+ int retval;
+
+ narg = setup_narg(cmd, &arg, ioctl_narg_len);
+ GetOpenFile(io, fptr);
+ retval = do_ioctl(fptr->fd, cmd, narg);
+ return finish_narg(retval, arg, fptr);
+}
+
/*
* call-seq:
* ios.ioctl(integer_cmd, arg) -> integer
@@ -10369,20 +10374,10 @@ rb_fcntl(VALUE io, VALUE req, VALUE arg)
long narg;
int retval;
- narg = setup_narg(cmd, &arg, 0);
+ narg = setup_narg(cmd, &arg, fcntl_narg_len);
GetOpenFile(io, fptr);
retval = do_fcntl(fptr->fd, cmd, narg);
- if (retval < 0) rb_sys_fail_path(fptr->pathv);
- if (RB_TYPE_P(arg, T_STRING)) {
- char *ptr;
- long slen;
- RSTRING_GETMEM(arg, ptr, slen);
- if (ptr[slen-1] != 17)
- rb_raise(rb_eArgError, "return value overflowed string");
- ptr[slen-1] = '\0';
- }
-
- return INT2NUM(retval);
+ return finish_narg(retval, arg, fptr);
}
/*