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; }