bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] perror: test for output mismatch


From: Eric Blake
Subject: [PATCH] perror: test for output mismatch
Date: Tue, 21 Jun 2011 17:10:29 -0600

On IRIX 6.5, strerror(-1) returns NULL but perror("") for errno
of -1 prints "Unknown error"; POSIX requires that the two must
match, so we must replace perror.  But since IRIX also lacks
strerror_r, our probe for a working [__xpg_]strerror_r was
never even happening.

* m4/perror.m4 (gl_FUNC_PERROR): Add test, in order to replace
perror on IRIX.

Signed-off-by: Eric Blake <address@hidden>
---

Tested on Fedora 14 (perror replaced because __xpg_strerror_r has bugs),
Rawhide (perror used as-is), and IRIX 6.5 (perror replaced because
it differs from strerror).

 ChangeLog    |    4 ++++
 m4/perror.m4 |   40 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 07f3819..36d72ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-06-21  Eric Blake  <address@hidden>

+       perror: test for output mismatch
+       * m4/perror.m4 (gl_FUNC_PERROR): Add test, in order to replace
+       perror on IRIX.
+
        strerror_r: fix OpenBSD behavior on out-of-range
        * lib/strerror_r.c (strerror_r): Always use maximal string.
        * doc/posix-functions/strerror_r.texi (strerror_r): Document it.
diff --git a/m4/perror.m4 b/m4/perror.m4
index d08f365..86e2020 100644
--- a/m4/perror.m4
+++ b/m4/perror.m4
@@ -1,4 +1,4 @@
-# perror.m4 serial 2
+# perror.m4 serial 3
 dnl Copyright (C) 2008-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -9,13 +9,45 @@ AC_DEFUN([gl_FUNC_PERROR],
   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
   AC_REQUIRE([gl_HEADER_ERRNO_H])
   AC_REQUIRE([gl_FUNC_STRERROR_R])
-  if test -n "$ERRNO_H"; then
+  AC_REQUIRE([gl_FUNC_STRERROR_0])
+  dnl We intentionally do not check for the broader REPLACE_STRERROR_R,
+  dnl since on glibc systems, strerror_r is replaced only for signature
+  dnl issues, and perror is just fine.  Rather, we only want to
+  dnl replace perror if strerror_r was replaced for a content fix.
+  if test "$ERRNO_H:$REPLACE_STRERROR_0" != :0; then
     dnl The system's perror() cannot know about the new errno values we add
-    dnl to <errno.h>. Replace it.
+    dnl to <errno.h>, or any fix for strerror(0). Replace it.
     REPLACE_PERROR=1
   fi
   case ${gl_cv_func_strerror_r_works-unset} in
-    unset|*yes) ;;
+    unset|*yes)
+      AC_CACHE_CHECK([whether perror matches strerror],
+        [gl_cv_func_perror_works],
+        [AC_RUN_IFELSE(
+           [AC_LANG_PROGRAM(
+              [[#include <errno.h>
+                #include <stdio.h>
+              ]],
+              [[char *str = strerror (-1);
+                if (!getenv("CONFTEST_OUTPUT")) return 0;
+                if (!str) str = "";
+                puts (str);
+                errno = -1;
+                perror ("");
+              ]])],
+           [CONFTEST_OUTPUT=1 ./conftest$EXEEXT >conftest.txt1 2>conftest.txt2
+            if cmp conftest.txt1 conftest.txt2 >/dev/null; then
+              gl_cv_func_perror_works=yes
+            else
+              gl_cv_func_perror_works=no
+            fi
+            rm -rf conftest.txt1 conftest.txt2],
+           [gl_cv_func_perror_works=no],
+           [dnl Guess no when cross-compiling.
+            gl_cv_func_perror_works="guessing no"])])
+       if test "$gl_cv_func_perror_works" != yes; then
+         REPLACE_PERROR=1
+       fi ;;
     *) dnl The system's perror() probably inherits the bugs in the
        dnl system's strerror_r(). Replace it.
       REPLACE_PERROR=1 ;;
-- 
1.7.4.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]