X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Funsetenv.c;h=53721fc440be95e18ba87ed510c2fcb5e4eb3c8c;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=75670119de44fa4b4fe9c49b7cbec394ddc19a17;hpb=8dffeb6f35aff7e201bed55c43ea83b62139803e;p=gnulib.git
diff --git a/lib/unsetenv.c b/lib/unsetenv.c
index 75670119d..53721fc44 100644
--- a/lib/unsetenv.c
+++ b/lib/unsetenv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,1995-1999,2000-2002,2005-2009 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995-2002, 2005-2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This program is free software: you can redistribute it and/or modify
@@ -14,6 +14,10 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
#include
/* Specification. */
@@ -28,15 +32,15 @@
#include
#if !_LIBC
-# define __environ environ
+# define __environ environ
#endif
#if _LIBC
-/* This lock protects against simultaneous modifications of `environ'. */
+/* This lock protects against simultaneous modifications of 'environ'. */
# include
__libc_lock_define_initialized (static, envlock)
-# define LOCK __libc_lock_lock (envlock)
-# define UNLOCK __libc_lock_unlock (envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
#else
# define LOCK
# define UNLOCK
@@ -69,13 +73,13 @@ unsetenv (const char *name)
while (*ep != NULL)
if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
{
- /* Found it. Remove this pointer by moving later ones back. */
- char **dp = ep;
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
- do
- dp[0] = dp[1];
- while (*dp++);
- /* Continue the loop in case NAME appears again. */
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
}
else
++ep;
@@ -93,6 +97,13 @@ weak_alias (__unsetenv, unsetenv)
#else /* HAVE_UNSETENV */
# undef unsetenv
+# if !HAVE_DECL_UNSETENV
+# if VOID_UNSETENV
+extern void unsetenv (const char *);
+# else
+extern int unsetenv (const char *);
+# endif
+# endif
/* Call the underlying unsetenv, in case there is hidden bookkeeping
that needs updating beyond just modifying environ. */
@@ -105,10 +116,11 @@ rpl_unsetenv (const char *name)
errno = EINVAL;
return -1;
}
+ while (getenv (name))
# if !VOID_UNSETENV
- result =
+ result =
# endif
- unsetenv (name);
+ unsetenv (name);
return result;
}