summaryrefslogtreecommitdiff
path: root/gnulib-m4/fcntl-o.m4
diff options
context:
space:
mode:
Diffstat (limited to 'gnulib-m4/fcntl-o.m4')
-rw-r--r--gnulib-m4/fcntl-o.m497
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.])
])