Refactor setup_narg and extract finish_narg
This commit is contained in:
parent
02a9a72f43
commit
c29c2afafe
Notes:
git
2021-12-21 13:34:24 +09:00
61
io.c
61
io.c
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user