summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw@src.gnome.org>2015-09-05 23:35:57 +0800
committerColin Walters <walters@verbum.org>2015-09-07 15:18:01 -0400
commitebf961a58d540ea40611ad75bc983f5386d3635b (patch)
tree7e2cdb9ca32b1db81ceb181352d01b527c2e8b1f
parente773acfe9a0f8cf4d67799f6177997bd8a761ede (diff)
downloadglib-ebf961a58d540ea40611ad75bc983f5386d3635b.tar.gz
Make g_strerror work with non-glibc POSIX systems
We should only use GNU-specific strerror_r on glibc. On other systems, we should use the XSI-compliant version. https://bugzilla.gnome.org/show_bug.cgi?id=754601
-rw-r--r--glib/gstrfuncs.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c
index f1085a1ba..2f0cda1dc 100644
--- a/glib/gstrfuncs.c
+++ b/glib/gstrfuncs.c
@@ -1258,14 +1258,19 @@ g_strerror (gint errnum)
gint saved_errno = errno;
GError *error = NULL;
- /* Since we are building with _GNU_SOURCE, we get the
- * GNU variant of strerror_r (with glibc).
- */
#ifdef G_OS_WIN32
strerror_s (buf, sizeof (buf), errnum);
msg = buf;
-#else
+ /* If we're using glibc, since we are building with _GNU_SOURCE, we
+ * expect to get the GNU variant of strerror_r. However, use the
+ * provided check from man strerror_r(3) in case we ever stop using
+ * _GNU_SOURCE (admittedly unlikely).
+ */
+#elif (defined __GLIBC__) && !((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
msg = strerror_r (errnum, buf, sizeof (buf));
+#else
+ strerror_r (errnum, buf, sizeof (buf));
+ msg = buf;
#endif
if (!g_get_charset (NULL))
{