]> granicus.if.org Git - p11-kit/commitdiff
library: Use dedicated locale object for printing error
authorDaiki Ueno <dueno@redhat.com>
Fri, 27 Apr 2018 08:00:52 +0000 (10:00 +0200)
committerDaiki Ueno <ueno@gnu.org>
Tue, 1 May 2018 11:30:43 +0000 (13:30 +0200)
common/debug.c
common/library.c
common/message.c
common/test-message.c
configure.ac

index 5f7546e3aeff09ac06528fa4a567653b556dc5fc..c731305ab5a9ebfb76b87ef2f186d9281796b122 100644 (file)
@@ -73,6 +73,10 @@ static bool debug_strict = false;
 /* global variable exported in debug.h */
 int p11_debug_current_flags = ~0;
 
+#ifdef HAVE_LOCALE_H
+extern locale_t p11_message_locale;
+#endif
+
 static int
 parse_environ_flags (void)
 {
@@ -151,9 +155,6 @@ p11_debug_message_err (int flag,
 {
        va_list args;
        char strerr[P11_DEBUG_MESSAGE_MAX];
-#ifdef HAVE_STRERROR_L
-       locale_t loc;
-#endif
 
        if (flag & p11_debug_current_flags) {
                fprintf (stderr, "(p11-kit:%d) ", getpid());
@@ -162,10 +163,9 @@ p11_debug_message_err (int flag,
                va_end (args);
 
                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));
+#if defined(HAVE_STRERROR_L) && defined(HAVE_NEWLOCALE)
+               if (p11_message_locale != (locale_t) 0)
+                       strncpy (strerr, strerror_l (errnum, p11_message_locale), sizeof (strerr));
 #else
                strerror_r (errnum, strerr, sizeof (strerr));
 #endif
index 37cb1c8485551be86677b4969608565bb852bf00..52c334735c8e5e832445f1aeb8c23a1e76309794 100644 (file)
@@ -44,6 +44,9 @@
 #include "message.h"
 
 #include <assert.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
 #include <stdarg.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -67,6 +70,10 @@ pthread_once_t p11_library_once = PTHREAD_ONCE_INIT;
 
 unsigned int p11_forkid = 1;
 
+#ifdef HAVE_LOCALE_H
+extern locale_t p11_message_locale;
+#endif
+
 static char *
 thread_local_message (void)
 {
@@ -123,6 +130,9 @@ p11_library_init_impl (void)
        p11_mutex_init (&p11_virtual_mutex);
        pthread_key_create (&thread_local, free);
        p11_message_storage = thread_local_message;
+#ifdef HAVE_NEWLOCALE
+       p11_message_locale = newlocale (LC_ALL_MASK, "POSIX", (locale_t) 0);
+#endif
 
        pthread_atfork (NULL, NULL, count_forks);
 }
@@ -142,6 +152,9 @@ p11_library_uninit (void)
        free (pthread_getspecific (thread_local));
        pthread_setspecific (thread_local, NULL);
 
+#ifdef HAVE_NEWLOCALE
+       freelocale (p11_message_locale);
+#endif
        p11_message_storage = dont_store_message;
        pthread_key_delete (thread_local);
        p11_mutex_uninit (&p11_virtual_mutex);
index 34e0d5be2dd46bbc8424e536cec5800c32bec237..e4e00d5ea96775f98fb4ce2fffe5f4eb60846f38 100644 (file)
 
 static bool print_messages = false;
 
+#ifdef HAVE_LOCALE_H
+locale_t p11_message_locale = (locale_t) 0;
+#endif
+
 static char *
 default_message_storage (void)
 {
@@ -104,9 +108,6 @@ 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);
@@ -118,10 +119,9 @@ p11_message_err (int errnum,
        buffer[length] = 0;
 
        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));
+#if defined(HAVE_STRERROR_L) && defined(HAVE_NEWLOCALE)
+       if (p11_message_locale != (locale_t) 0)
+               strncpy (strerr, strerror_l (errnum, p11_message_locale), sizeof (strerr));
 #else
        strerror_r (errnum, strerr, sizeof (strerr));
 #endif
index 7dd5426fa8be855614f959e60deb6b81845b7927..339ad4b2ff702b362998d6fe0a44f8d4d2e47b01 100644 (file)
 #include "message.h"
 
 #include <errno.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
 #include <stdlib.h>
 #include <stdio.h>
 
+#ifdef HAVE_LOCALE_H
+extern locale_t p11_message_locale;
+#endif
+
 static void
 test_with_err (void)
 {
        const char *last;
        char *expected;
 
+#ifdef HAVE_NEWLOCALE
+       p11_message_locale = newlocale (LC_ALL_MASK, "POSIX", (locale_t) 0);
+#endif
+
        errno = E2BIG;
        p11_message_err (ENOENT, "Details: %s", "value");
        last = p11_message_last ();
@@ -55,6 +66,10 @@ test_with_err (void)
                assert_not_reached ();
        assert_str_eq (expected, last);
        free (expected);
+
+#ifdef HAVE_NEWLOCALE
+       freelocale (p11_message_locale);
+#endif
 }
 
 int
index 7fcbe01873627479a0d05f7d6aa7b1ea9f04025d..c4db7489f874735322a562b00182dda9ece6e8db 100644 (file)
@@ -101,7 +101,7 @@ if test "$os_unix" = "yes"; then
        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_l strerror_r])
+       AC_CHECK_FUNCS([strnstr memdup newlocale strndup strerror_l strerror_r])
        AC_CHECK_FUNCS([reallocarray])
        AC_CHECK_FUNCS([fdwalk])
        AC_CHECK_FUNCS([setenv])