#endif
#include <string.h>
+#include <errno.h>
#include <locale.h>
+#include <assert.h>
#include <vlc_common.h>
static const char *vlc_strerror_l(int errnum, const char *lname)
{
+ int saved_errno = errno;
locale_t loc = newlocale(LC_MESSAGES_MASK, lname, (locale_t)0);
+
+ if (unlikely(loc == (locale_t)0))
+ {
+ if (errno == ENOENT) /* fallback to POSIX locale */
+ loc = newlocale(LC_MESSAGES_MASK, "C", (locale_t)0);
+
+ if (unlikely(loc == (locale_t)0))
+ {
+ assert(errno != EINVAL && errno != ENOENT);
+ errno = saved_errno;
+ return "Error message unavailable";
+ }
+ errno = saved_errno;
+ }
+
const char *buf = strerror_l(errnum, loc);
freelocale(loc);