Refactor setup_narg and extract finish_narg

This commit is contained in:
Nobuyoshi Nakada 2021-10-23 12:21:50 +09:00
parent 02a9a72f43
commit c29c2afafe
Notes: git 2021-12-21 13:34:24 +09:00

61
io.c
View File

@ -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,6 +10266,22 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
return narg;
}
static VALUE
finish_narg(int retval, VALUE arg, const rb_io_t *fptr)
{
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] != NARG_SENTINEL)
rb_raise(rb_eArgError, "return value overflowed string");
ptr[slen-1] = '\0';
}
return INT2NUM(retval);
}
#ifdef HAVE_IOCTL
static VALUE
rb_ioctl(VALUE io, VALUE req, VALUE arg)
@ -10276,20 +10291,10 @@ rb_ioctl(VALUE io, VALUE req, VALUE arg)
long narg;
int retval;
narg = setup_narg(cmd, &arg, 1);
narg = setup_narg(cmd, &arg, ioctl_narg_len);
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)
rb_raise(rb_eArgError, "return value overflowed string");
ptr[slen-1] = '\0';
}
return INT2NUM(retval);
return finish_narg(retval, arg, fptr);
}
/*
@ -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);
}
/*