annotate lib/unsetenv.c @ 6650:d8e00d7c098d

Normalize inclusion of `config.h'.
author Jim Meyering <jim@meyering.net>
date Fri, 24 Feb 2006 10:09:59 +0000
parents a48fb0e98c8c
children 54c2c5912cdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5008
b2e3ca7de860 Propagating gettext into gnulib a bit better.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4683
diff changeset
1 /* Copyright (C) 1992,1995-1999,2000-2002 Free Software Foundation, Inc.
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2 This file is part of the GNU C Library.
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3
4440
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
4 This program is free software; you can redistribute it and/or modify
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
5 it under the terms of the GNU General Public License as published by
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
7 any later version.
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8
4440
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
9 This program is distributed in the hope that it will be useful,
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
4440
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
12 GNU General Public License for more details.
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13
4440
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
14 You should have received a copy of the GNU General Public License along
e58a1c05a6ba Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4080
diff changeset
15 with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5008
diff changeset
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
6650
d8e00d7c098d Normalize inclusion of `config.h'.
Jim Meyering <jim@meyering.net>
parents: 5848
diff changeset
18 #ifdef HAVE_CONFIG_H
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 # include <config.h>
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include <errno.h>
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 #if !_LIBC
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 # if !defined errno && !defined HAVE_ERRNO_DECL
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 extern int errno;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 # endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 # define __set_errno(ev) ((errno) = (ev))
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29
4683
4452e4c45cc4 Assume ANSI C <string.h>, <stdlib.h>.
Bruno Haible <bruno@clisp.org>
parents: 4440
diff changeset
30 #include <stdlib.h>
4452e4c45cc4 Assume ANSI C <string.h>, <stdlib.h>.
Bruno Haible <bruno@clisp.org>
parents: 4440
diff changeset
31 #include <string.h>
4080
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 #if _LIBC || HAVE_UNISTD_H
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 # include <unistd.h>
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 #if !_LIBC
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 # define __environ environ
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 # ifndef HAVE_ENVIRON_DECL
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 extern char **environ;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 # endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 #if _LIBC
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 /* This lock protects against simultaneous modifications of `environ'. */
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 # include <bits/libc-lock.h>
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 __libc_lock_define_initialized (static, envlock)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 # define LOCK __libc_lock_lock (envlock)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 # define UNLOCK __libc_lock_unlock (envlock)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 #else
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 # define LOCK
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 # define UNLOCK
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 /* In the GNU C library we must keep the namespace clean. */
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 #ifdef _LIBC
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 # define unsetenv __unsetenv
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 #endif
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 int
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 unsetenv (const char *name)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 {
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 size_t len;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 char **ep;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 {
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 __set_errno (EINVAL);
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 return -1;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 }
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 len = strlen (name);
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 LOCK;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 ep = __environ;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 while (*ep != NULL)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 {
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 /* Found it. Remove this pointer by moving later ones back. */
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 char **dp = ep;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 do
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 dp[0] = dp[1];
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 while (*dp++);
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 /* Continue the loop in case NAME appears again. */
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 }
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 else
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 ++ep;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 UNLOCK;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 return 0;
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 }
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 #ifdef _LIBC
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 # undef unsetenv
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 weak_alias (__unsetenv, unsetenv)
d064e5107035 setenv and unsetenv.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 #endif