From e15966ac7f3b43df2acf869f98089762807d0568 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Fri, 10 Mar 2017 17:44:22 +0300 Subject: [PATCH] lib: escape usage of strerror_l() if it doesn't exist in libc uClibc doesn't implement strerror_l() and thus libnl starting from 3.2.29 couldn't be compiled with it any longer. To work-around that problem we'll just do a check on strerror_l() availability during configuration and if it's not there just fall back to locale-less strerror(). See-also: 6c2d111177e91184073c44f83d4a6182aaba06d7 http://lists.infradead.org/pipermail/libnl/2017-March/002301.html Signed-off-by: Alexey Brodkin Signed-off-by: Thomas Haller Signed-off-by: Baruch Siach --- Patch status: upstream commit e15966ac7f3b43df configure.ac | 2 ++ lib/utils.c | 8 +++++++- src/lib/utils.c | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 68b285e5b15c..2739b997ee3a 100644 --- a/configure.ac +++ b/configure.ac @@ -121,6 +121,8 @@ fi AC_CONFIG_SUBDIRS([doc]) +AC_CHECK_FUNCS([strerror_l]) + AC_CONFIG_FILES([ Makefile libnl-3.0.pc diff --git a/lib/utils.c b/lib/utils.c index fb350d13fd2f..06273c5b291e 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -30,7 +30,9 @@ #include #include #include /* exit() */ +#ifdef HAVE_STRERROR_L #include +#endif /** * Global variable indicating the desired level of debugging output. @@ -123,9 +125,10 @@ int __nl_read_num_str_file(const char *path, int (*cb)(long, const char *)) const char *nl_strerror_l(int err) { + const char *buf; +#ifdef HAVE_STRERROR_L int errno_save = errno; locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0); - const char *buf; if (loc == (locale_t)0) { if (errno == ENOENT) @@ -140,6 +143,9 @@ const char *nl_strerror_l(int err) } errno = errno_save; +#else + buf = strerror(err); +#endif return buf; } /** @endcond */ diff --git a/src/lib/utils.c b/src/lib/utils.c index 5878f279c364..feb1d4ef4056 100644 --- a/src/lib/utils.c +++ b/src/lib/utils.c @@ -81,6 +81,7 @@ void nl_cli_fatal(int err, const char *fmt, ...) fprintf(stderr, "\n"); } else { char *buf; +#ifdef HAVE_STRERROR_L locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0); if (loc == (locale_t)0) { if (errno == ENOENT) @@ -91,9 +92,14 @@ void nl_cli_fatal(int err, const char *fmt, ...) } if (loc != (locale_t)0) buf = strerror_l(err, loc); +#else + buf = strerror(err); +#endif fprintf(stderr, "%s\n", buf); +#ifdef HAVE_STRERROR_L if (loc != (locale_t)0) freelocale(loc); +#endif } exit(abs(err)); -- 2.11.0