diff --git a/configure.ac b/configure.ac index 3e37663..12cf2e9 100644 --- a/configure.ac +++ b/configure.ac @@ -169,7 +169,7 @@ AC_TYPE_PID_T # Checks for library functions. AC_FUNC_VPRINTF AC_FUNC_MMAP -AC_CHECK_FUNCS([link mkstemp mkostemp _mktemp_s mkdtemp getopt getopt_long getprogname getexecname rand random lrand48 random_r rand_r readlink fstatvfs fstatfs lstat]) +AC_CHECK_FUNCS([link mkstemp mkostemp _mktemp_s mkdtemp getopt getopt_long getprogname getexecname rand random lrand48 random_r rand_r readlink fstatvfs fstatfs lstat strerror strerror_r]) dnl AC_CHECK_FUNCS doesn't check for header files. dnl posix_fadvise() may be not available in older libc. diff --git a/src/fcxml.c b/src/fcxml.c index aa6612d..1ee1ba1 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -22,6 +22,10 @@ * PERFORMANCE OF THIS SOFTWARE. */ +#ifdef _GNU_SOURCE +#undef _GNU_SOURCE /* To use the POSIX version of strerror_r */ +#endif +#include #include "fcint.h" #include #include @@ -3451,7 +3455,21 @@ _FcConfigParse (FcConfig *config, len = read (fd, buf, BUFSIZ); if (len < 0) { - FcConfigMessage (0, FcSevereError, "failed reading config file"); + int errno_ = errno; + char ebuf[BUFSIZ+1]; + +#if HAVE_STRERROR_R + int x FC_UNUSED; + x = strerror_r (errno_, ebuf, BUFSIZ); /* make sure we use the POSIX version of strerror_r */ +#elif HAVE_STRERROR + char *tmp = strerror (errno_); + size_t len = strlen (tmp); + strncpy (ebuf, tmp, FC_MIN (BUFSIZ, len)); + ebuf[FC_MIN (BUFSIZ, len)] = 0; +#else + ebuf[0] = 0; +#endif + FcConfigMessage (0, FcSevereError, "failed reading config file: %s: %s (errno %d)", realfilename, ebuf, errno_); close (fd); goto bail1; }