Branch
Hash :
bc1bf2fc
Author :
Date :
2025-05-26T18:30:18
fcntl-h: support O_DIRECTORY It is relatively easy to support O_DIRECTORY on platforms that lack it, so let’s do that instead of having to work around bugs like <https://bugs.gnu.org/78509#95>. * lib/fcntl.in.h (O_DIRECTORY): Default to 0x20000000 not 0, since Gnulib now supports it. * lib/open.c, lib/openat.c (OPEN_TRAILING_SLASH_BUG): Default to false, so that this can be used outside #if. (open, openat): Add support for O_DIRECTORY on platforms that lack it. If fstat fails, fail instead of assuming the file is a directory, since failure can occur due to EOVERFLOW, etc. Rearrange code to minimize differences between open.c and openat.c. * m4/fcntl-o.m4 (gl_FCNTL_O_FLAGS): Also test O_DIRECTORY, and define HAVE_WORKING_O_DIRECTORY if needed. Prefer AS_CASE for Emacs’s benefit. * m4/open.m4 (gl_FUNC_OPEN): * m4/openat.m4 (gl_FUNC_OPENAT): Require gl_FCNTL_O_FLAGS and replace the function if O_DIRECTORY does not work. * tests/test-open.h: Test O_DIRECTORY.
# openat.m4
# serial 47
dnl Copyright (C) 2004-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.
# See if we need to use our replacement for Solaris' openat et al functions.
# Written by Jim Meyering.
AC_DEFUN([gl_FUNC_OPENAT],
[
AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
AC_CHECK_FUNCS_ONCE([openat])
AC_REQUIRE([gl_FCNTL_O_FLAGS])
AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
AC_REQUIRE([gl_PREPROC_O_CLOEXEC])
AS_CASE([$ac_cv_func_openat+$gl_cv_header_working_fcntl_h+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC],
[yes+*O_DIRECTORY*+*+* | yes+*no+*+*], [REPLACE_OPENAT=1],
[yes+*+*yes+yes], [],
[yes+*], [REPLACE_OPENAT=1],
[HAVE_OPENAT=0])
])
# Prerequisites of lib/openat.c.
AC_DEFUN([gl_PREREQ_OPENAT],
[
AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
:
])