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);
   }
   {




Reply via email to