On 2025-09-01, Paul Eggert wrote: > >> AT_FDCWD has been -1 on Haiku for many years, and has been changed > >> to -100 only recently: > >> https://cgit.haiku-os.org/haiku/commit/headers/posix/fcntl.h?id=b8caef69155fbe87def579305622b9718d7779dc > > > > The *at tests still fail on Haiku, from what I remember. But I did not > > know about this change, thanks. > > > > I thought about fixing it, but it is quite a chore. And I couldn't find > > the motivation to do so since I do not use Haiku. > > Thanks for letting me know. I did an obvious part of that chore by > installing the attached. This also mentions Haiku in the manual. > Although I don't use Haiku either, we might as well be POSIX clean here.
This patch was a good attempt, but the *at tests still fail on Haiku. The reason is that while AT_FDCWD now has the value -100, the value -1 still acts like AT_FDCWD (for backward compatibility with older binaries, I guess). This probably won't change. Therefore, in order to avoid these test failures, it's better to try -2 as an invalid fd (instead of -1). 2026-01-08 Bruno Haible <[email protected]> Avoid test failures on Haiku, where -1 behaves like AT_FDCWD. * tests/test-readlinkat.c (main): Test file descriptor -2 instead of -1. * tests/test-areadlinkat.c (main): Likewise. * tests/test-areadlinkat-with-size.c (main): Likewise. * tests/test-faccessat.c (main): Likewise. * tests/test-fchmodat.c (main): Likewise. * tests/test-fchownat.c (main): Likewise. * tests/test-fstatat.c (main): Likewise. * tests/test-linkat.c (main): Likewise. * tests/test-mkdirat.c (main): Likewise. * tests/test-mkfifoat.c (main): Likewise. * tests/test-openat.c (main): Likewise. * tests/test-openat-safer.c (main): Likewise. * tests/test-openat2.c (main): Likewise. * tests/test-renameat.c (main): Likewise. * tests/test-renameatu.c (main): Likewise. * tests/test-symlinkat.c (main): Likewise. * tests/test-unlinkat.c (main): Likewise. * tests/test-utimensat.c (main): Likewise. diff --git a/tests/test-areadlinkat-with-size.c b/tests/test-areadlinkat-with-size.c index 1fd0ab11ca..01b5e180ca 100644 --- a/tests/test-areadlinkat-with-size.c +++ b/tests/test-areadlinkat-with-size.c @@ -73,7 +73,7 @@ main (void) ASSERT (strcmp (buf, "nowhere") == 0); free (buf); errno = 0; - ASSERT (areadlinkat_with_size (AT_FDCWD == -1 ? -2 : -1, BASE "link", 1) + ASSERT (areadlinkat_with_size (AT_FDCWD == -2 ? -1 : -2, BASE "link", 1) == NULL); ASSERT (errno == EBADF); errno = 0; diff --git a/tests/test-areadlinkat.c b/tests/test-areadlinkat.c index 137e8896b6..9b05d10555 100644 --- a/tests/test-areadlinkat.c +++ b/tests/test-areadlinkat.c @@ -73,7 +73,7 @@ main (void) ASSERT (strcmp (buf, "nowhere") == 0); free (buf); errno = 0; - ASSERT (areadlinkat (AT_FDCWD == -1 ? -2 : -1, BASE "link") == NULL); + ASSERT (areadlinkat (AT_FDCWD == -2 ? -1 : -2, BASE "link") == NULL); ASSERT (errno == EBADF); errno = 0; ASSERT (areadlinkat (AT_FDCWD, BASE "link") == NULL); diff --git a/tests/test-faccessat.c b/tests/test-faccessat.c index bd5807434d..53d3ecb0ac 100644 --- a/tests/test-faccessat.c +++ b/tests/test-faccessat.c @@ -34,7 +34,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (faccessat (AT_FDCWD == -1 ? -2 : -1, "foo", F_OK, 0) == -1); + ASSERT (faccessat (AT_FDCWD == -2 ? -1 : -2, "foo", F_OK, 0) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-fchmodat.c b/tests/test-fchmodat.c index 0f309aa7f0..fe278a7b4a 100644 --- a/tests/test-fchmodat.c +++ b/tests/test-fchmodat.c @@ -36,7 +36,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (fchmodat (AT_FDCWD == -1 ? -2 : -1, "foo", 0600, 0) == -1); + ASSERT (fchmodat (AT_FDCWD == -2 ? -1 : -2, "foo", 0600, 0) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-fchownat.c b/tests/test-fchownat.c index 15ee4dbb56..acc0338d15 100644 --- a/tests/test-fchownat.c +++ b/tests/test-fchownat.c @@ -78,7 +78,7 @@ main (_GL_UNUSED int argc, char *argv[]) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (fchownat (AT_FDCWD == -1 ? -2 : -1, "foo", getuid (), getgid (), 0) + ASSERT (fchownat (AT_FDCWD == -2 ? -1 : -2, "foo", getuid (), getgid (), 0) == -1); ASSERT (errno == EBADF); } diff --git a/tests/test-fstatat.c b/tests/test-fstatat.c index a7d174a86a..bd25905ca0 100644 --- a/tests/test-fstatat.c +++ b/tests/test-fstatat.c @@ -83,7 +83,7 @@ main (_GL_UNUSED int argc, _GL_UNUSED char *argv[]) struct stat statbuf; errno = 0; - ASSERT (fstatat (AT_FDCWD == -1 ? -2 : -1, "foo", &statbuf, 0) == -1); + ASSERT (fstatat (AT_FDCWD == -2 ? -1 : -2, "foo", &statbuf, 0) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-linkat.c b/tests/test-linkat.c index 64137dd693..c9954ecbff 100644 --- a/tests/test-linkat.c +++ b/tests/test-linkat.c @@ -96,7 +96,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (linkat (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar", 0) == -1); + ASSERT (linkat (AT_FDCWD == -2 ? -1 : -2, "foo", AT_FDCWD, "bar", 0) == -1); ASSERT (errno == EBADF); } { @@ -108,7 +108,7 @@ main (void) ASSERT (close (creat (BASE "oo", 0600)) == 0); { errno = 0; - ASSERT (linkat (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar", 0) + ASSERT (linkat (AT_FDCWD, BASE "oo", AT_FDCWD == -2 ? -1 : -2, "bar", 0) == -1); ASSERT (errno == EBADF); } diff --git a/tests/test-mkdirat.c b/tests/test-mkdirat.c index 94036eec17..ab26548925 100644 --- a/tests/test-mkdirat.c +++ b/tests/test-mkdirat.c @@ -56,7 +56,7 @@ main (_GL_UNUSED int argc, char *argv[]) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (mkdirat (AT_FDCWD == -1 ? -2 : -1, "foo", 0700) == -1); + ASSERT (mkdirat (AT_FDCWD == -2 ? -1 : -2, "foo", 0700) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-mkfifoat.c b/tests/test-mkfifoat.c index 02c1ba4fd8..431728845d 100644 --- a/tests/test-mkfifoat.c +++ b/tests/test-mkfifoat.c @@ -90,7 +90,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (func (AT_FDCWD == -1 ? -2 : -1, "foo", 0600) == -1); + ASSERT (func (AT_FDCWD == -2 ? -1 : -2, "foo", 0600) == -1); ASSERT (errno == EBADF || errno == ENOSYS /* seen on mingw */ ); diff --git a/tests/test-openat-safer.c b/tests/test-openat-safer.c index 0a37498929..57d3e2ae31 100644 --- a/tests/test-openat-safer.c +++ b/tests/test-openat-safer.c @@ -82,7 +82,7 @@ main (void) ASSERT (openat (dfd, "", O_RDONLY) == -1); ASSERT (errno == ENOENT); errno = 0; - ASSERT (openat (AT_FDCWD == -1 ? -2 : -1, ".", O_RDONLY) == -1); + ASSERT (openat (AT_FDCWD == -2 ? -1 : -2, ".", O_RDONLY) == -1); ASSERT (errno == EBADF); /* Check for trailing slash and /dev/null handling. */ @@ -96,7 +96,7 @@ main (void) ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL); #if defined __linux__ || defined __ANDROID__ /* Using a bad directory is okay for absolute paths. */ - fd = openat (AT_FDCWD == -1 ? -2 : -1, "/dev/null", O_WRONLY); + fd = openat (AT_FDCWD == -2 ? -1 : -2, "/dev/null", O_WRONLY); ASSERT (STDERR_FILENO < fd); #endif /* Using a non-directory is wrong for relative paths. */ diff --git a/tests/test-openat.c b/tests/test-openat.c index c6754276d0..bbda402a52 100644 --- a/tests/test-openat.c +++ b/tests/test-openat.c @@ -69,7 +69,7 @@ main () /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (openat (AT_FDCWD == -1 ? -2 : -1, "foo", O_RDONLY) == -1); + ASSERT (openat (AT_FDCWD == -2 ? -1 : -2, "foo", O_RDONLY) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-openat2.c b/tests/test-openat2.c index c760e4874c..0085410ed9 100644 --- a/tests/test-openat2.c +++ b/tests/test-openat2.c @@ -587,7 +587,7 @@ main () /* Test behavior for invalid file descriptors. */ { errno = 0; - ASSERT (openat2 (AT_FDCWD == -1 ? -2 : -1, "foo", &ro, sizeof ro) == -1); + ASSERT (openat2 (AT_FDCWD == -2 ? -1 : -2, "foo", &ro, sizeof ro) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-readlinkat.c b/tests/test-readlinkat.c index 69c21d54a6..ac4d3410d4 100644 --- a/tests/test-readlinkat.c +++ b/tests/test-readlinkat.c @@ -61,7 +61,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (readlinkat (AT_FDCWD == -1 ? -2 : -1, "foo", buf, sizeof buf) + ASSERT (readlinkat (AT_FDCWD == -2 ? -1 : -2, "foo", buf, sizeof buf) == -1); ASSERT (errno == EBADF); } diff --git a/tests/test-renameat.c b/tests/test-renameat.c index 50931d1891..83fd5e79b1 100644 --- a/tests/test-renameat.c +++ b/tests/test-renameat.c @@ -62,7 +62,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (renameat (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar") == -1); + ASSERT (renameat (AT_FDCWD == -2 ? -1 : -2, "foo", AT_FDCWD, "bar") == -1); ASSERT (errno == EBADF); } { @@ -74,7 +74,7 @@ main (void) ASSERT (close (creat (BASE "oo", 0600)) == 0); { errno = 0; - ASSERT (renameat (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar") + ASSERT (renameat (AT_FDCWD, BASE "oo", AT_FDCWD == -2 ? -1 : -2, "bar") == -1); ASSERT (errno == EBADF); } diff --git a/tests/test-renameatu.c b/tests/test-renameatu.c index e96e83e84f..e9a56c6ea0 100644 --- a/tests/test-renameatu.c +++ b/tests/test-renameatu.c @@ -65,7 +65,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (renameatu (AT_FDCWD == -1 ? -2 : -1, "foo", AT_FDCWD, "bar", 0) + ASSERT (renameatu (AT_FDCWD == -2 ? -1 : -2, "foo", AT_FDCWD, "bar", 0) == -1); ASSERT (errno == EBADF); } @@ -78,7 +78,7 @@ main (void) ASSERT (close (creat (BASE "oo", 0600)) == 0); { errno = 0; - ASSERT (renameatu (AT_FDCWD, BASE "oo", AT_FDCWD == -1 ? -2 : -1, "bar", 0) + ASSERT (renameatu (AT_FDCWD, BASE "oo", AT_FDCWD == -2 ? -1 : -2, "bar", 0) == -1); ASSERT (errno == EBADF); } diff --git a/tests/test-symlinkat.c b/tests/test-symlinkat.c index fb4e620ff4..1932c2e1d9 100644 --- a/tests/test-symlinkat.c +++ b/tests/test-symlinkat.c @@ -60,7 +60,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (symlinkat ("foo", AT_FDCWD == -1 ? -2 : -1, "bar") == -1); + ASSERT (symlinkat ("foo", AT_FDCWD == -2 ? -1 : -2, "bar") == -1); ASSERT (errno == EBADF || errno == ENOSYS /* seen on mingw */ ); diff --git a/tests/test-unlinkat.c b/tests/test-unlinkat.c index 0e8d5e0493..4e1d1cae04 100644 --- a/tests/test-unlinkat.c +++ b/tests/test-unlinkat.c @@ -67,7 +67,7 @@ main () /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (unlinkat (AT_FDCWD == -1 ? -2 : -1, "foo", 0) == -1); + ASSERT (unlinkat (AT_FDCWD == -2 ? -1 : -2, "foo", 0) == -1); ASSERT (errno == EBADF); } { diff --git a/tests/test-utimensat.c b/tests/test-utimensat.c index 6f6daaba78..aa2afb12fd 100644 --- a/tests/test-utimensat.c +++ b/tests/test-utimensat.c @@ -71,7 +71,7 @@ main (void) /* Test behaviour for invalid file descriptors. */ { errno = 0; - ASSERT (utimensat (AT_FDCWD == -1 ? -2 : -1, "foo", NULL, 0) == -1); + ASSERT (utimensat (AT_FDCWD == -2 ? -1 : -2, "foo", NULL, 0) == -1); ASSERT (errno == EBADF); } {
