From c2d9967f78d2e6f93f8d9876c2b3ab25aa6b86e7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 16 Jun 2021 11:51:21 +0900 Subject: [PATCH] Configure ioctl request argument type [Bug #17759] --- configure.ac | 30 ++++++++++++++++++++++++++++++ io.c | 4 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 93065427fa..38ab4bd586 100644 --- a/configure.ac +++ b/configure.ac @@ -2753,6 +2753,36 @@ AS_IF([test "x$rb_cv_const_page_size" = xyes], [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 1)], [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 0)] ) + +AS_IF([test "x$ac_cv_func_ioctl" = xyes], [ + AC_CACHE_CHECK([ioctl request type], rb_cv_ioctl_request_type, + [rb_cv_ioctl_request_type=no + dnl corresponding NUM2IOCTLREQ needs to be defined + for type in "unsigned long:ULONG_MAX" int:INT_MAX; do + max=`echo $type | sed 's/.*://'` + type=`echo $type | sed 's/:.*//'` + RUBY_WERROR_FLAG([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + @%:@include + @%:@if defined(HAVE_SYS_IOCTL_H) && !defined(_WIN32) + @%:@include + @%:@endif + ]], [[ + $type req = $max; + if (ioctl(0, req)) {/* do nothing*/}; + ]])], + [rb_cv_ioctl_request_type="$type"]) + ]) + test "x$rb_cv_ioctl_request_type" = xno || break + done]) + AS_CASE(["$rb_cv_ioctl_request_type"], [no|int], [], + ["unsigned long"], [ + AC_DEFINE_UNQUOTED(IOCTL_REQ_TYPE, [$rb_cv_ioctl_request_type]) + AC_DEFINE_UNQUOTED(NUM2IOCTLREQ(num), [NUM2ULONG(num)]) + ]) +]) + } : "runtime section" && { diff --git a/io.c b/io.c index 1051149d9d..eceec8bf44 100644 --- a/io.c +++ b/io.c @@ -9810,8 +9810,8 @@ rb_f_select(int argc, VALUE *argv, VALUE obj) return rb_ensure(select_call, (VALUE)&args, select_end, (VALUE)&args); } -#if (defined(__linux__) && !defined(__ANDROID__)) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) - typedef unsigned long ioctl_req_t; +#ifdef IOCTL_REQ_TYPE + typedef IOCTL_REQ_TYPE ioctl_req_t; # define NUM2IOCTLREQ(num) NUM2ULONG(num) #else typedef int ioctl_req_t;