# perror.m4 serial 6
dnl Copyright (C) 2008-2012 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

AC_DEFUN([gl_FUNC_PERROR],
[
  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
  AC_REQUIRE([gl_HEADER_ERRNO_H])
  AC_REQUIRE([gl_FUNC_STRERROR_R])
  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>, or any fix for strerror(0). Replace it.
    REPLACE_PERROR=1
  fi
  case ${gl_cv_func_strerror_r_works-unset} in
    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>
                #include <stdlib.h>
                #include <string.h>
              ]],
              [[char *str = strerror (-1);
                if (!getenv("CONFTEST_OUTPUT")) return 0;
                if (!str) str = "";
                puts (str);
                errno = -1;
                perror ("");
                return 0;
              ]])],
           [if CONFTEST_OUTPUT=1 ./conftest$EXEEXT >conftest.txt1 2>conftest.txt2 \
               && 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
      ;;
  esac
])
