Steven M. Schweda wrote:

You need more old-junk computers in your collection.

I've already got too many, thanks.

I assume that this constitutes a bug in the Tru64 C RTL

I'd call it a bug, but strictly speaking POSIX allows this behavior. It's not worth worrying about this corner case so I changed the test to avoid the problem, by installing the attached patch into gnulib.

diff --git a/ChangeLog b/ChangeLog
index 6f49920..e273b83 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2014-01-20  Paul Eggert  <egg...@cs.ucla.edu>
 
+	fdopen-tests: port to Tru64
+	* tests/test-fdopen.c (main): Don't invoke fdopen on a file
+	descriptor that is not open, as POSIX doesn't specify the
+	resulting behavior and the test does not work on Tru64.
+	Problem reported by Steven M. Schweda in:
+	http://lists.gnu.org/archive/html/bug-gnulib/2014-01/msg00079.html
+
 	stdalign: port to HP-UX compilers
 	* lib/stdalign.in.h (_Alignas): Use __attribute__ (__aligned__ (x))
 	if __HP_cc or __HP_aCC are nonzero.
diff --git a/tests/test-fdopen.c b/tests/test-fdopen.c
index 96a887f..743511e 100644
--- a/tests/test-fdopen.c
+++ b/tests/test-fdopen.c
@@ -29,28 +29,21 @@ SIGNATURE_CHECK (fdopen, FILE *, (int, const char *));
 int
 main (void)
 {
-  /* Test behaviour for invalid file descriptors.  */
-  {
-    FILE *fp;
-
-    errno = 0;
-    fp = fdopen (-1, "r");
-    if (fp == NULL)
-      ASSERT (errno == EBADF);
-    else
-      fclose (fp);
-  }
-  {
-    FILE *fp;
-
-    close (99);
-    errno = 0;
-    fp = fdopen (99, "r");
-    if (fp == NULL)
-      ASSERT (errno == EBADF);
-    else
-      fclose (fp);
-  }
+  /* Test behavior on failure.  POSIX makes it hard to check for
+     failure, since the behavior is not well-defined on invalid file
+     descriptors, so try fdopen 1000 times and if that's not enough to
+     fail due to EMFILE, so be it.  */
+
+  int i;
+  for (i = 0; i < 1000; i++)
+    {
+      errno = 0;
+      if (! fdopen (STDOUT_FILENO, "w"))
+        {
+          ASSERT (errno != 0);
+          break;
+        }
+    }
 
   return 0;
 }

Reply via email to