unsetenv.c revision 1.1
1/* Copyright (C) 1992,1995-1999,2000-2002 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2, or (at your option)
7   any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License along
15   with this program; if not, write to the Free Software Foundation,
16   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18#if HAVE_CONFIG_H
19# include <config.h>
20#endif
21
22#include <errno.h>
23#if !_LIBC
24# if !defined errno && !defined HAVE_ERRNO_DECL
25extern int errno;
26# endif
27# define __set_errno(ev) ((errno) = (ev))
28#endif
29
30#include <stdlib.h>
31#include <string.h>
32#if _LIBC || HAVE_UNISTD_H
33# include <unistd.h>
34#endif
35
36#if !_LIBC
37# define __environ	environ
38# ifndef HAVE_ENVIRON_DECL
39extern char **environ;
40# endif
41#endif
42
43#if _LIBC
44/* This lock protects against simultaneous modifications of `environ'.  */
45# include <bits/libc-lock.h>
46__libc_lock_define_initialized (static, envlock)
47# define LOCK	__libc_lock_lock (envlock)
48# define UNLOCK	__libc_lock_unlock (envlock)
49#else
50# define LOCK
51# define UNLOCK
52#endif
53
54/* In the GNU C library we must keep the namespace clean.  */
55#ifdef _LIBC
56# define unsetenv __unsetenv
57#endif
58
59
60int
61unsetenv (const char *name)
62{
63  size_t len;
64  char **ep;
65
66  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
67    {
68      __set_errno (EINVAL);
69      return -1;
70    }
71
72  len = strlen (name);
73
74  LOCK;
75
76  ep = __environ;
77  while (*ep != NULL)
78    if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
79      {
80	/* Found it.  Remove this pointer by moving later ones back.  */
81	char **dp = ep;
82
83	do
84	  dp[0] = dp[1];
85	while (*dp++);
86	/* Continue the loop in case NAME appears again.  */
87      }
88    else
89      ++ep;
90
91  UNLOCK;
92
93  return 0;
94}
95
96#ifdef _LIBC
97# undef unsetenv
98weak_alias (__unsetenv, unsetenv)
99#endif
100