Branch
Hash :
8ba0c4da
Author :
Date :
2025-09-01T13:04:21
tests: adapt AT_FDCWD fix for more tests * tests/test-areadlinkat-with-size.c (main): * tests/test-areadlinkat.c (main): * tests/test-faccessat.c (main): * tests/test-fchmodat.c (main): * tests/test-fchownat.c (main): * tests/test-fstatat.c (main): * tests/test-linkat.c (main): * tests/test-mkdirat.c (main): * tests/test-mkfifoat.c (main): * tests/test-openat-safer.c (main): * tests/test-readlinkat.c (main): * tests/test-renameat.c (main): * tests/test-renameatu.c (main): * tests/test-symlinkat.c (main): * tests/test-unlinkat.c (main): * tests/test-utimensat.c (main): Work even if AT_FDCWD == -1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
@node fcntl.h
@section @file{fcntl.h}
POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fcntl.h.html}
Gnulib module: fcntl-h
@mindex fcntl-h
Portability problems fixed by Gnulib:
@itemize
@item
The type @code{pid_t} is not defined on some platforms:
MSVC 14.
@item
The type @code{mode_t} is not defined on some platforms:
MSVC 14.
@item
The type @code{off64_t} is not defined on some platforms:
macOS 14, FreeBSD 10.4, NetBSD 10.0, OpenBSD 7.5, MSVC 14, Cygwin, Haiku, Minix 3.3.
@item
@samp{O_CLOEXEC} is not defined on some platforms:
Mac OS X 10.6, FreeBSD 8.4, NetBSD 5.1, OpenBSD 4.9, Minix 3.1.8, AIX 7.1, HP-UX 11.31, Solaris 10, Cygwin 1.7.1, mingw, MSVC 14.
@item
@samp{O_DSYNC}, @samp{O_NOCTTY},
@samp{O_NOFOLLOW}, @samp{O_RSYNC}, @samp{O_SYNC},
and @samp{O_TTY_INIT} are not defined on some platforms.
When not otherwise defined, Gnulib defines these macros to 0,
which is generally safe.
@item
@samp{O_NONBLOCK} is not defined on some platforms.
@mindex nonblocking
If the @samp{nonblocking} module is in use, gnulib guarantees a working
non-zero value; otherwise, the gnulib replacement is 0.
@item
@samp{O_EXEC} is not defined on some platforms:
glibc 2.42, macOS 12, FreeBSD 7.4, NetBSD 9.4, OpenBSD 7.5, HP-UX 11, Solaris 10, Cygwin 1.5.x, mingw, MSVC 14, Android.
However, glibc does define @samp{O_EXEC} on GNU/Hurd.
When not otherwise defined,
Gnulib defines this macro to @samp{O_RDONLY}, which is typically 0.
Note: @samp{O_EXEC} is not suitable for opening a file descriptor
that you want to use with @code{fchmod} later, because
musl libc defines @samp{O_EXEC} to @code{O_PATH} and
@c https://lists.gnu.org/archive/html/bug-gnulib/2012-11/msg00029.html
Linux @code{fchmod} fails with error @code{EBADF} when given such a file
descriptor.
@item
@samp{O_SEARCH} is not defined on some platforms:
glibc 2.42, macOS 12, FreeBSD 12.4, NetBSD 6.1, OpenBSD 7.5, AIX 6.1, HP-UX 11, Solaris 10, Cygwin 1.5.x, mingw, MSVC 14, Android.
When not otherwise defined,
Gnulib defines this macro to @samp{O_RDONLY}, which is typically 0.
@item
@samp{O_SEARCH} is defined to @code{O_PATH} on some platforms:
@c https://bugs.gnu.org/75405
musl libc.
@item
@samp{O_ACCMODE} is not defined on some platforms:
MSVC 14.
@item
The @samp{O_ACCMODE} mask mistakenly omits @samp{O_SEARCH} and
@samp{O_EXEC} on some platforms:
Cygwin.
@item
@samp{O_BINARY}, @samp{O_TEXT} (not specified by POSIX, but essential for
portability to native Windows platforms) are defined on some platforms but
not on others.
Gnulib defines these macros to 0 on GNU and other platforms that do not
distinguish between text and binary I/O@.
@item
@samp{O_CLOEXEC}, @samp{O_NOFOLLOW}, and @samp{O_TTY_INIT}
are defined to values that are too large for an @code{int} on some platforms:
AIX 7.1 with XL C 12.1.
@item
@samp{O_DIRECT}, @samp{O_IGNORE_CTTY}, @samp{O_NDELAY},
@samp{O_NOATIME}, @samp{O_NOLINK}, @samp{O_NOLINKS}, and
@samp{O_NOTRANS} (not specified by POSIX) are defined
on some platforms but not on others.
When not otherwise defined, Gnulib defines these macros to 0,
which is generally safe.
@item
@samp{O_DIRECTORY} is not defined on some platforms:
glibc 2.0, Mac OS X 10.4, FreeBSD 7.4, NetBSD 4.0.1, OpenBSD 4.9, HP-UX 11, Solaris 10, Cygwin 1.5.x, mingw, MSVC 14.
@item
@samp{FD_CLOEXEC}, @samp{F_DUPFD}, and @samp{F_GETFD} are not defined
on some platforms:
mingw, MSVC 14.
@item
@samp{F_DUPFD_CLOEXEC} is not defined on some platforms:
Mac OS X 10.5, FreeBSD 6.0, NetBSD 5.0, OpenBSD 7.5, AIX 5.1, HP-UX 11, Solaris 11 2010-11, Cygwin 1.7.1, mingw, MSVC 14.
@item
@samp{AT_FDCWD}, @samp{AT_EACCESS}, @samp{AT_SYMLINK_NOFOLLOW},
@samp{AT_SYMLINK_FOLLOW}, and @samp{AT_REMOVEDIR}
are not defined on many platforms:
glibc 2.3.6, Mac OS X 10.5, FreeBSD 6.0, NetBSD 5.0, OpenBSD 7.5, AIX 5.1, HP-UX 11, Cygwin 1.5.x, mingw, MSVC 14.
@item
@samp{AT_FDCWD} is defined with a value too large for an @code{int} on some
platforms:
Solaris 11.3.
@end itemize
Portability problems not fixed by Gnulib:
@itemize
@item
On some platforms, @samp{O_NOATIME} and @samp{O_NOFOLLOW}
are defined but do not work.
To help work around the resulting portability problems,
the @code{fcntl-h} module defines @samp{HAVE_WORKING_O_NOATIME} to 1
on platforms where @samp{O_NOATIME} is known to work, and to 0 otherwise;
and similarly for @samp{HAVE_WORKING_O_NOFOLLOW} and @samp{O_NOFOLLOW}:
Mac OS X 10.3.
@item
@samp{O_PATH} is not defined on some platforms:
glibc 2.13, macOS 13, FreeBSD 13.0, NetBSD 9.2, OpenBSD 7.1, Minix 3.3.0, AIX 7.3, HP-UX 11.31, Solaris 11.4, Cygwin 2.9, mingw, MSVC 14.
@item
Although POSIX.1-2024 standardized @code{O_CLOFORK},
@code{FD_CLOFORK} and @code{F_DUPFD_CLOFORK},
they are not defined on most platforms:
glibc 2.42, musl libc, macOS 15.5, FreeBSD 14.2, NetBSD 10.1, OpenBSD 7.7, Minix 3.3.0, AIX 7.3, Solaris 11.3, Cygwin 3.6.2, mingw, MSVC 14.
@item
@samp{F_SETFD}, @samp{F_GETFL}, @samp{F_SETFL}, @samp{F_GETLK},
@samp{F_SETLK}, @samp{F_SETLKW}, @samp{F_GETOWN}, and @samp{F_SETOWN}
are not defined on some platforms:
mingw, MSVC 14.
@item
@samp{POSIX_FADV_DONTNEED}, @samp{POSIX_FADV_NOREUSE},
@samp{POSIX_FADV_NORMAL}, @samp{POSIX_FADV_RANDOM},
@samp{POSIX_FADV_SEQUENTIAL}, and @samp{POSIX_FADV_WILLNEED} are not
defined on some platforms.
@item
POSIX allows @samp{AT_FDCWD} to be @minus{}1, so it is unsafe to use
@samp{AT_FDCWD} as an invalid directory file descriptor argument to
functions like @samp{openat}.
Instead, you can use @samp{AT_FDCWD == -1 ? -2 : -1}.
@samp{AT_FDCWD} is @minus{}1 on some platforms:
Haiku R1/Beta4.
@end itemize