diff --git a/configure.ac b/configure.ac index 715734fa8c175..efd5aff48751d 100644 --- a/configure.ac +++ b/configure.ac @@ -454,6 +454,11 @@ if test "$GCC" = "yes"; then PHP_BROKEN_GCC_STRLEN_OPT fi +dnl Detect the headers required to use makedev, major, and minor. +dnl Autoconf <= 2.69 didn't check glibc 2.25 deprecated macros in sys/types.h. +m4_version_prereq([2.70],,[ac_cv_header_sys_types_h_makedev=no]) +AC_HEADER_MAJOR + dnl Checks for typedefs, structures, and compiler characteristics. dnl ---------------------------------------------------------------------------- diff --git a/ext/fileinfo/config.m4 b/ext/fileinfo/config.m4 index 8751e1ed7b8f9..a38a205822efd 100644 --- a/ext/fileinfo/config.m4 +++ b/ext/fileinfo/config.m4 @@ -14,6 +14,8 @@ if test "$PHP_FILEINFO" != "no"; then libmagic/readcdf.c libmagic/softmagic.c libmagic/der.c \ libmagic/buffer.c libmagic/is_csv.c" + AC_CHECK_HEADERS([sys/sysmacros.h]) + AC_CHECK_FUNCS([strcasestr],,[ AC_MSG_NOTICE(using libmagic strcasestr implementation) libmagic_sources="$libmagic_sources libmagic/strcasestr.c" diff --git a/ext/posix/config.m4 b/ext/posix/config.m4 index 8d5ad1ce69f8b..9f1091a3c4521 100644 --- a/ext/posix/config.m4 +++ b/ext/posix/config.m4 @@ -8,9 +8,19 @@ if test "$PHP_POSIX" = "yes"; then AC_DEFINE(HAVE_POSIX, 1, [whether to include POSIX-like functions]) PHP_NEW_EXTENSION(posix, posix.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) - AC_CHECK_HEADERS([sys/mkdev.h sys/sysmacros.h]) - - AC_CHECK_FUNCS(seteuid setegid setsid getsid getpgid ctermid mkfifo mknod setrlimit getrlimit getgroups makedev initgroups getgrgid_r eaccess) + AC_CHECK_FUNCS(seteuid setegid setsid getsid getpgid ctermid mkfifo mknod setrlimit getrlimit getgroups initgroups getgrgid_r eaccess) + + dnl Check for makedev. If it's defined as a macro, AC_CHECK_FUNCS won't work. + dnl Required headers are included by the AC_HEADER_MAJOR logic. + AC_CHECK_FUNCS([makedev],, + [AC_CHECK_DECL([makedev], [AC_DEFINE([HAVE_MAKEDEV], [1])],, [ + #include + #ifdef MAJOR_IN_MKDEV + # include + #elif defined(MAJOR_IN_SYSMACROS) + # include + #endif + ])]) dnl Skip pathconf and fpathconf check on musl libc due to limited implementation dnl (first argument is not validated and has different error). diff --git a/ext/posix/posix.c b/ext/posix/posix.c index aa17cc95d8046..f6e028f9a96e3 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -39,10 +39,9 @@ #include #include #include -#ifdef HAVE_SYS_MKDEV_H +#ifdef MAJOR_IN_MKDEV # include -#endif -#ifdef HAVE_SYS_SYSMACROS_H +#elif defined(MAJOR_IN_SYSMACROS) # include #endif @@ -620,7 +619,7 @@ PHP_FUNCTION(posix_mknod) zend_argument_value_error(3, "cannot be 0 for the POSIX_S_IFCHR and POSIX_S_IFBLK modes"); RETURN_THROWS(); } else { -#if defined(HAVE_MAKEDEV) || defined(makedev) +#ifdef HAVE_MAKEDEV php_dev = makedev(major, minor); #else php_error_docref(NULL, E_WARNING, "Cannot create a block or character device, creating a normal file instead");