[PATCH] lib: Escape usage of strerror_l() if it doesn't exist in libc

Alexey Brodkin Alexey.Brodkin at synopsys.com
Fri Mar 10 06:44:22 PST 2017


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 at synopsys.com>
Cc: Andre Draszik <adraszik at tycoint.com>
Cc: Thomas Haller <thaller at redhat.com>
---
 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




More information about the libnl mailing list