#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>
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);
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);
])
# 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])