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 #endif
static long static long
fcntl_narg_len(int cmd) fcntl_narg_len(ioctl_req_t cmd)
{ {
long len; long len;
@ -10212,19 +10212,21 @@ fcntl_narg_len(int cmd)
} }
#else /* HAVE_FCNTL */ #else /* HAVE_FCNTL */
static long static long
fcntl_narg_len(int cmd) fcntl_narg_len(ioctl_req_t cmd)
{ {
return 0; return 0;
} }
#endif /* HAVE_FCNTL */ #endif /* HAVE_FCNTL */
#define NARG_SENTINEL 17
static long 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; long narg = 0;
VALUE arg = *argp; VALUE arg = *argp;
if (NIL_P(arg) || arg == Qfalse) { if (!RTEST(arg)) {
narg = 0; narg = 0;
} }
else if (FIXNUM_P(arg)) { else if (FIXNUM_P(arg)) {
@ -10244,10 +10246,7 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
long len, slen; long len, slen;
*argp = arg = tmp; *argp = arg = tmp;
if (io_p) len = narg_len(cmd);
len = ioctl_narg_len(cmd);
else
len = fcntl_narg_len((int)cmd);
rb_str_modify(arg); rb_str_modify(arg);
slen = RSTRING_LEN(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 */ /* a little sanity check here */
ptr = RSTRING_PTR(arg); ptr = RSTRING_PTR(arg);
ptr[slen - 1] = 17; ptr[slen - 1] = NARG_SENTINEL;
narg = (long)(SIGNED_VALUE)ptr; narg = (long)(SIGNED_VALUE)ptr;
} }
} }
@ -10267,6 +10266,22 @@ setup_narg(ioctl_req_t cmd, VALUE *argp, int io_p)
return narg; 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 #ifdef HAVE_IOCTL
static VALUE static VALUE
rb_ioctl(VALUE io, VALUE req, VALUE arg) rb_ioctl(VALUE io, VALUE req, VALUE arg)
@ -10276,20 +10291,10 @@ rb_ioctl(VALUE io, VALUE req, VALUE arg)
long narg; long narg;
int retval; int retval;
narg = setup_narg(cmd, &arg, 1); narg = setup_narg(cmd, &arg, ioctl_narg_len);
GetOpenFile(io, fptr); GetOpenFile(io, fptr);
retval = do_ioctl(fptr->fd, cmd, narg); retval = do_ioctl(fptr->fd, cmd, narg);
if (retval < 0) rb_sys_fail_path(fptr->pathv); return finish_narg(retval, arg, fptr);
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);
} }
/* /*
@ -10369,20 +10374,10 @@ rb_fcntl(VALUE io, VALUE req, VALUE arg)
long narg; long narg;
int retval; int retval;
narg = setup_narg(cmd, &arg, 0); narg = setup_narg(cmd, &arg, fcntl_narg_len);
GetOpenFile(io, fptr); GetOpenFile(io, fptr);
retval = do_fcntl(fptr->fd, cmd, narg); retval = do_fcntl(fptr->fd, cmd, narg);
if (retval < 0) rb_sys_fail_path(fptr->pathv); return finish_narg(retval, arg, fptr);
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);
} }
/* /*