123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- From 098a4cc35b0da4438b8b67a914edecebef5bb6a9 Mon Sep 17 00:00:00 2001
- From: Alexey Brodkin <abrodkin@synopsys.com>
- Date: Fri, 10 Mar 2017 13:22:14 +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().
- Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
- Cc: Andre Draszik <adraszik@tycoint.com>
- Cc: Thomas Haller <thaller@redhat.com>
- ---
- This patch is now accepted upstream and will be a part of the next libnl
- release, see
- https://github.com/thom311/libnl/commit/e15966ac7f3b43df2acf869f98089762807d0568
- 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 <netlink/utils.h>
- #include <linux/socket.h>
- #include <stdlib.h> /* exit() */
- +#ifdef HAVE_STRERROR_L
- #include <locale.h>
- +#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.7.4
|