147 lines
4.2 KiB
Diff
147 lines
4.2 KiB
Diff
From 683f27fbb68ca2028a7b3468f17164d484df2759 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <adraszik@tycoint.com>
|
|
Date: Thu, 25 Aug 2016 13:14:59 +0100
|
|
Subject: [PATCH 1/3] lib: add utility function nl_strerror_l()
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
libnl currently uses strerror_r() throughout, but this is
|
|
problematic because there is a non-standard GNU version
|
|
implemented in glibc, and the standard POSIX version, which
|
|
differ in signature. When using glibc, one can choose
|
|
between the two versions using feature test macros
|
|
_GNU_SOURCE and _POSIX_C_SOURCE.
|
|
|
|
Given libnl is built using the former, we always get the
|
|
glibc special version, and all code so far has been written
|
|
for that non-standard version.
|
|
|
|
Other C libraries like musl on the other hand only try
|
|
to be posix compliant, and only ever provide the posix
|
|
version of strerror_r(), which has a different signature.
|
|
|
|
The alternative is to use strerror_l() rather than
|
|
strerror_r() http://austingroupbugs.net/view.php?id=655
|
|
- this will avoid the non-confirming versions issue
|
|
- strerror_l() is now recommended by POSIX to replace
|
|
strerror_r() usage
|
|
|
|
So rather than changing all uses of strerror_r() to be in
|
|
line with posix, we are going to switch to the recommended
|
|
interface strerror_l().
|
|
|
|
Since strerror_l() is slightly more difficuly to use, we
|
|
add a little (private) wrapper that we can use from all
|
|
current callsites of strerror_r().
|
|
|
|
Signed-off-by: André Draszik <adraszik@tycoint.com>
|
|
Reviewed-by: Stephane Ayotte <sayotte@tycoint.com>
|
|
Signed-off-by: Thomas Haller <thaller@redhat.com>
|
|
---
|
|
Upstream-Status: Backport https://github.com/thom311/libnl/commit/683f27fbb68ca2028a7b3468f17164d484df2759
|
|
include/Makefile.am | 1 +
|
|
include/netlink-private/utils.h | 17 +++++++++++++++++
|
|
lib/utils.c | 24 ++++++++++++++++++++++++
|
|
libnl-3.sym | 5 +++++
|
|
4 files changed, 47 insertions(+)
|
|
create mode 100644 include/netlink-private/utils.h
|
|
|
|
diff --git a/include/Makefile.am b/include/Makefile.am
|
|
index 804e984..f8b977a 100644
|
|
--- a/include/Makefile.am
|
|
+++ b/include/Makefile.am
|
|
@@ -166,6 +166,7 @@ noinst_HEADERS = \
|
|
netlink-private/socket.h \
|
|
netlink-private/tc.h \
|
|
netlink-private/types.h \
|
|
+ netlink-private/utils.h \
|
|
netlink-private/cache-api.h \
|
|
netlink-private/object-api.h \
|
|
netlink-private/route/link/api.h \
|
|
diff --git a/include/netlink-private/utils.h b/include/netlink-private/utils.h
|
|
new file mode 100644
|
|
index 0000000..77aadb3
|
|
--- /dev/null
|
|
+++ b/include/netlink-private/utils.h
|
|
@@ -0,0 +1,17 @@
|
|
+/*
|
|
+ * netlink-private/utils.h Local Utility Functions
|
|
+ *
|
|
+ * This library is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU Lesser General Public
|
|
+ * License as published by the Free Software Foundation version 2.1
|
|
+ * of the License.
|
|
+ *
|
|
+ * Copyright (c) 2003-2012 Thomas Graf <tgraf@suug.ch>
|
|
+ */
|
|
+
|
|
+#ifndef NETLINK_UTILS_PRIV_H_
|
|
+#define NETLINK_UTILS_PRIV_H_
|
|
+
|
|
+extern const char * nl_strerror_l(int err);
|
|
+
|
|
+#endif
|
|
diff --git a/lib/utils.c b/lib/utils.c
|
|
index 61c3d95..c1c1b72 100644
|
|
--- a/lib/utils.c
|
|
+++ b/lib/utils.c
|
|
@@ -25,10 +25,12 @@
|
|
*/
|
|
|
|
#include <netlink-private/netlink.h>
|
|
+#include <netlink-private/utils.h>
|
|
#include <netlink/netlink.h>
|
|
#include <netlink/utils.h>
|
|
#include <linux/socket.h>
|
|
#include <stdlib.h> /* exit() */
|
|
+#include <locale.h>
|
|
|
|
/**
|
|
* Global variable indicating the desired level of debugging output.
|
|
@@ -118,6 +120,28 @@ int __nl_read_num_str_file(const char *path, int (*cb)(long, const char *))
|
|
|
|
return 0;
|
|
}
|
|
+
|
|
+const char *nl_strerror_l(int err)
|
|
+{
|
|
+ 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)
|
|
+ loc = newlocale(LC_MESSAGES_MASK,
|
|
+ "POSIX", (locale_t)0);
|
|
+ }
|
|
+ if (loc != (locale_t)0) {
|
|
+ buf = strerror_l(err, loc);
|
|
+ freelocale(loc);
|
|
+ } else {
|
|
+ buf = "newlocale() failed";
|
|
+ }
|
|
+
|
|
+ errno = errno_save;
|
|
+ return buf;
|
|
+}
|
|
/** @endcond */
|
|
|
|
/**
|
|
diff --git a/libnl-3.sym b/libnl-3.sym
|
|
index 4e09bdd..9119e66 100644
|
|
--- a/libnl-3.sym
|
|
+++ b/libnl-3.sym
|
|
@@ -351,3 +351,8 @@ libnl_3_2_28 {
|
|
global:
|
|
nl_object_diff64;
|
|
} libnl_3_2_27;
|
|
+
|
|
+libnl_3_2_29 {
|
|
+global:
|
|
+ nl_strerror_l;
|
|
+} libnl_3_2_28;
|
|
--
|
|
2.9.3
|
|
|