]> granicus.if.org Git - p11-kit/commitdiff
compat: Prefer strerror_l to strerror_r
authorDaiki Ueno <dueno@redhat.com>
Fri, 9 Jun 2017 12:41:13 +0000 (14:41 +0200)
committerDaiki Ueno <ueno@gnu.org>
Mon, 12 Jun 2017 09:30:42 +0000 (11:30 +0200)
strerror_r is being obsolete in the next POSIX specification:
http://austingroupbugs.net/view.php?id=655

common/message.c
configure.ac

index 35f2764487a9311ad247b12f5eed3a50a1c7f225..ccc310ea0196993e9e61d11c2bd344fb180a24fc 100644 (file)
 #include "message.h"
 
 #include <assert.h>
+#include <errno.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
 #include <stdarg.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -100,6 +104,9 @@ p11_message_err (int errnum,
        char strerr[P11_MESSAGE_MAX];
        va_list va;
        size_t length;
+#ifdef HAVE_STRERROR_L
+       locale_t loc;
+#endif
 
        va_start (va, msg);
        length = vsnprintf (buffer, P11_MESSAGE_MAX - 1, msg, va);
@@ -110,8 +117,14 @@ p11_message_err (int errnum,
                length = P11_MESSAGE_MAX - 1;
        buffer[length] = 0;
 
-       strncpy (strerr, "Unknown error", sizeof (strerr));
+       snprintf (strerr, sizeof (strerr), "Unknown error %d", errnum);
+#ifdef HAVE_STRERROR_L
+       loc = uselocale ((locale_t) 0);
+       if (loc != NULL)
+               strncpy (strerr, strerror_l (errnum, loc), sizeof (strerr));
+#else
        strerror_r (errnum, strerr, sizeof (strerr));
+#endif
        strerr[P11_MESSAGE_MAX - 1] = 0;
 
        p11_message ("%s: %s", buffer, strerr);
index e978201d8c65e9a69ae23326ab6eea873f143f36..2fab9e99c65f97396a9b2b28de4e6a674e8cb20d 100644 (file)
@@ -86,11 +86,11 @@ if test "$os_unix" = "yes"; then
        ])
 
        # These are thngs we can work around
-       AC_CHECK_HEADERS([sys/resource.h])
+       AC_CHECK_HEADERS([locale.h sys/resource.h])
        AC_CHECK_MEMBERS([struct dirent.d_type],,,[#include <dirent.h>])
        AC_CHECK_FUNCS([getprogname getexecname basename mkstemp mkdtemp])
        AC_CHECK_FUNCS([getauxval issetugid getresuid secure_getenv])
-       AC_CHECK_FUNCS([strnstr memdup strndup strerror_r])
+       AC_CHECK_FUNCS([strnstr memdup strndup strerror_l strerror_r])
        AC_CHECK_FUNCS([fdwalk])
        AC_CHECK_FUNCS([setenv])
        AC_CHECK_FUNCS([getpeereid])