changeset 14272:1af1ed4871ed

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>
author Eric Blake <eblake@redhat.com>
date Sat, 05 Feb 2011 14:31:59 -0700
parents b4cc3c41ca79
children 8f6d3e05c7e2
files ChangeLog doc/posix-functions/unsetenv.texi m4/setenv.m4
diffstat 3 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- a/doc/posix-functions/unsetenv.texi
+++ b/doc/posix-functions/unsetenv.texi
@@ -25,7 +25,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:
--- 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 @@
     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"])])