summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-02-05 14:31:59 -0700
committerEric Blake <eblake@redhat.com>2011-02-05 15:19:15 -0700
commitad98f8ef519af652b76508875f037fb3ca95a35f (patch)
tree97744c8cbe039e9dcf41014473f43459442524a1
parentabac9b73490cd4d59a1e454c6ade5fd2073f2d2f (diff)
downloadgnulib-ad98f8ef519af652b76508875f037fb3ca95a35f.tar.gz
unsetenv: work around Haiku issues
On Haiku alpha 2, test-unsetenv.c passed in isolation with just system headers, but failed when libgnu and replacement headers were in use. Why? Because putenv("a") fails to remove "a=..." from the environment, but the gnulib rpl_putenv works by assigning to environ. Apparently, Haiku is doing some funky caching issues, and correctly removes all vestiges of environment duplicates when Haiku is in charge, but not after assigning to environ forces Haiku to rebuild its cache. The m4 change is sufficient to detect Haiku's oddities, and the existing replacement then passes just fine. * m4/setenv.m4 (gl_FUNC_UNSETENV): Also detect Haiku issue. * doc/posix-functions/unsetenv.texi (unsetenv): Document it. Signed-off-by: Eric Blake <eblake@redhat.com>
-rw-r--r--ChangeLog4
-rw-r--r--doc/posix-functions/unsetenv.texi2
-rw-r--r--m4/setenv.m418
3 files changed, 19 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index c9620974f2..eb17b6deb8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2011-02-05 Eric Blake <eblake@redhat.com>
+ unsetenv: work around Haiku issues
+ * m4/setenv.m4 (gl_FUNC_UNSETENV): Also detect Haiku issue.
+ * doc/posix-functions/unsetenv.texi (unsetenv): Document it.
+
strerror_r-posix: port to cygwin
* lib/strerror_r.c (strerror_r) [__CYGWIN__]: Add cygwin
implementation.
diff --git a/doc/posix-functions/unsetenv.texi b/doc/posix-functions/unsetenv.texi
index 160ef83575..2c43b1e530 100644
--- a/doc/posix-functions/unsetenv.texi
+++ b/doc/posix-functions/unsetenv.texi
@@ -25,7 +25,7 @@ FreeBSD 6.0, NetBSD 1.6, OpenBSD 4.7.
@item
This function removes only the first value association for the given
environment variable, not all of them, on some platforms:
-Solaris 11 2010-11.
+Solaris 11 2010-11, Haiku.
@end itemize
Portability problems not fixed by Gnulib:
diff --git a/m4/setenv.m4 b/m4/setenv.m4
index c5c8061dc9..ba619b082e 100644
--- a/m4/setenv.m4
+++ b/m4/setenv.m4
@@ -1,4 +1,4 @@
-# setenv.m4 serial 20
+# setenv.m4 serial 21
dnl Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -97,20 +97,30 @@ int unsetenv();
fi
dnl Solaris 10 unsetenv does not remove all copies of a name.
+ dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
dnl OpenBSD 4.7 unsetenv("") does not fail.
AC_CACHE_CHECK([whether unsetenv obeys POSIX],
[gl_cv_func_unsetenv_works],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#include <errno.h>
+ extern char **environ;
]], [[
- char entry[] = "b=2";
+ char entry1[] = "a=1";
+ char entry2[] = "b=2";
+ char *env[] = { entry1, entry2, NULL };
if (putenv ((char *) "a=1")) return 1;
- if (putenv (entry)) return 2;
- entry[0] = 'a';
+ if (putenv (entry2)) return 2;
+ entry2[0] = 'a';
unsetenv ("a");
if (getenv ("a")) return 3;
if (!unsetenv ("") || errno != EINVAL) return 4;
+ entry2[0] = 'b';
+ environ = env;
+ if (!getenv ("a")) return 5;
+ entry2[0] = 'a';
+ unsetenv ("a");
+ if (getenv ("a")) return 6;
]])],
[gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
[gl_cv_func_unsetenv_works="guessing no"])])