diff options
Diffstat (limited to 'gnulib-m4/fcntl-o.m4')
-rw-r--r-- | gnulib-m4/fcntl-o.m4 | 97 |
1 files changed, 64 insertions, 33 deletions
diff --git a/gnulib-m4/fcntl-o.m4 b/gnulib-m4/fcntl-o.m4 index 43aa1325..8020c481 100644 --- a/gnulib-m4/fcntl-o.m4 +++ b/gnulib-m4/fcntl-o.m4 @@ -1,15 +1,17 @@ # fcntl-o.m4 -# serial 8 -dnl Copyright (C) 2006, 2009-2024 Free Software Foundation, Inc. +# serial 12 +dnl Copyright (C) 2006, 2009-2025 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. +dnl This file is offered as-is, without any warranty. dnl Written by Paul Eggert. AC_PREREQ([2.60]) -# Test whether the flags O_NOATIME and O_NOFOLLOW actually work. +# Test whether the flags O_DIRECTORY, O_NOATIME and O_NOFOLLOW actually work. +# Define HAVE_WORKING_O_DIRECTORY to 1 if O_DIRECTORY works, or to 0 otherwise. # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. AC_DEFUN([gl_FCNTL_O_FLAGS], @@ -30,16 +32,23 @@ AC_DEFUN([gl_FCNTL_O_FLAGS], #else /* on Windows with MSVC */ # include <io.h> # include <stdlib.h> - # defined sleep(n) _sleep ((n) * 1000) + # define sleep(n) _sleep ((n) * 1000) #endif + #include <errno.h> #include <fcntl.h> ]GL_MDA_DEFINES[ + #ifndef O_DIRECTORY + #define O_DIRECTORY 0 + #endif #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif + #ifndef O_SEARCH + #define O_SEARCH O_RDONLY + #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, @@ -52,31 +61,38 @@ AC_DEFUN([gl_FCNTL_O_FLAGS], { static char const sym[] = "conftest.sym"; if (symlink ("/dev/null", sym) != 0) - result |= 2; + result |= 1; else { int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); if (fd >= 0) { close (fd); - result |= 4; + result |= 3; } } if (unlink (sym) != 0 || symlink (".", sym) != 0) - result |= 2; + result |= 1; else { int fd = open (sym, O_RDONLY | O_NOFOLLOW); if (fd >= 0) { close (fd); - result |= 4; + result |= 3; } } unlink (sym); } #endif { + int fd = open ("confdefs.h", O_SEARCH | O_DIRECTORY); + if (!(fd < 0 && errno == ENOTDIR)) + result |= 4; + if (0 <= fd) + close (fd); + } + { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); if (fd < 0) @@ -111,31 +127,46 @@ AC_DEFUN([gl_FCNTL_O_FLAGS], } return result;]])], [gl_cv_header_working_fcntl_h=yes], - [case $? in #( - 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( - 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( - 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( - *) gl_cv_header_working_fcntl_h='no';; - esac], - [case "$host_os" in - # Guess 'no' on native Windows. - mingw* | windows*) gl_cv_header_working_fcntl_h='no' ;; - *) gl_cv_header_working_fcntl_h=cross-compiling ;; - esac - ]) - ]) + [AS_CASE([$?], + dnl We cannot catch exit code 1 or 2 here, because + dnl - exit code 1 can occur through a compilation error on mingw (e.g. + dnl when O_NOCTTY, O_NONBLOCK, O_SYNC are not defined) or when + dnl result = 1, whereas + dnl - exit code 2 can occur through a compilation error on MSVC (e.g. + dnl again when O_NOCTTY, O_NONBLOCK, O_SYNC are not defined) or when + dnl result = 2. + [ 3], [gl_cv_header_working_fcntl_h="no (bad O_NOFOLLOW)"], + [ 4], [gl_cv_header_working_fcntl_h="no (bad O_DIRECTORY)"], + [ 7], [gl_cv_header_working_fcntl_h="no (bad O_NOFOLLOW, O_DIRECTORY)"], + [64], [gl_cv_header_working_fcntl_h="no (bad O_NOATIME)"], + [67], [gl_cv_header_working_fcntl_h="no (bad O_NOFOLLOW, O_NOATIME)"], + [68], [gl_cv_header_working_fcntl_h="no (bad O_DIRECTORY, O_NOATIME)"], + [71], [gl_cv_header_working_fcntl_h="no (bad O_NOFOLLOW, O_DIRECTORY, O_NOATIME)"], + [gl_cv_header_working_fcntl_h="no"])], + [AS_CASE([$host_os,$gl_cross_guess_normal], + # The O_DIRECTORY test is known to fail on Mac OS X 10.4.11 (2007) + # (see <https://bugs.gnu.org/78509#95>) + # and to succeed on Mac OS X 10.5.8 [darwin9.8.0] (2009). + # Guess it fails on Mac OS X 10.4.x and earlier. + [darwin[[0-8]].*yes], + [gl_cv_header_working_fcntl_h="guessing no (bad O_DIRECTORY)"], + # Known to be "no" on native MS-Windows. + [mingw* | windows*], + [gl_cv_header_working_fcntl_h=no], + [gl_cv_header_working_fcntl_h=$gl_cross_guess_normal])])]) + + AS_CASE([$gl_cv_header_working_fcntl_h], + [*O_DIRECTORY* | *no], [gl_val=0], [gl_val=1]) + AC_DEFINE_UNQUOTED([HAVE_WORKING_O_DIRECTORY], [$gl_val], + [Define to 1 if O_DIRECTORY works, 0 otherwise.]) - case $gl_cv_header_working_fcntl_h in #( - *O_NOATIME* | no | cross-compiling) ac_val=0;; #( - *) ac_val=1;; - esac - AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], - [Define to 1 if O_NOATIME works.]) + AS_CASE([$gl_cv_header_working_fcntl_h], + [*O_NOATIME* | *no], [gl_val=0], [gl_val=1]) + AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$gl_val], + [Define to 1 if O_NOATIME works, 0 otherwise.]) - case $gl_cv_header_working_fcntl_h in #( - *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( - *) ac_val=1;; - esac - AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], - [Define to 1 if O_NOFOLLOW works.]) + AS_CASE([$gl_cv_header_working_fcntl_h], + [*O_NOFOLLOW* | *no], [gl_val=0], [gl_val=1]) + AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$gl_val], + [Define to 1 if O_NOFOLLOW works, 0 otherwise.]) ]) |