annotate lib/putenv.c @ 10384:adc4d1a5982d

remove duplicate #include directives * lib/putenv.c: Remove duplicate #include <stdlib.h>. * lib/chdir-long.c [TEST_CHDIR]: Remove duplicate #include <stdio.h>.
author Jim Meyering <meyering@redhat.com>
date Sun, 31 Aug 2008 16:24:24 +0200
parents daf5ba9fe2d9
children e8d2c6fc33ad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9749
daf5ba9fe2d9 Remove useless "if" tests before free. Deprecate "free" module.
Jim Meyering <meyering@redhat.com>
parents: 9434
diff changeset
1 /* Copyright (C) 1991, 1994, 1997-1998, 2000, 2003-2008
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
2 Free Software Foundation, Inc.
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
3
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
4 NOTE: The canonical source of this file is maintained with the GNU C
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
5 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
6
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8234
diff changeset
7 This program is free software: you can redistribute it and/or modify it
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
8 under the terms of the GNU General Public License as published by the
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8234
diff changeset
9 Free Software Foundation; either version 3 of the License, or any
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
10 later version.
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
11
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
12 This program is distributed in the hope that it will be useful,
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
15 GNU General Public License for more details.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
17 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8234
diff changeset
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
19
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
20 #include <config.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
21
9434
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
22 /* Specification. */
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
23 #include <stdlib.h>
8214
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
24
4347
df44e79ce676 .h files should stand alone, but we shouldn't include <sys/types.h>
Paul Eggert <eggert@cs.ucla.edu>
parents: 2411
diff changeset
25 #include <stddef.h>
1229
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
26
2411
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
27 /* Include errno.h *after* sys/types.h to work around header problems
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
28 on AIX 3.2.5. */
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
29 #include <errno.h>
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4672
diff changeset
30 #ifndef __set_errno
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
31 # define __set_errno(ev) ((errno) = (ev))
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
32 #endif
2411
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
33
4672
55a4d3c67ca7 Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4486
diff changeset
34 #include <string.h>
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
35 #include <unistd.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
36
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
37 #if HAVE_GNU_LD
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
38 # define environ __environ
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
39 #else
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
40 extern char **environ;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
41 #endif
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
42
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
43 #if _LIBC
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
44 /* This lock protects against simultaneous modifications of `environ'. */
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
45 # include <bits/libc-lock.h>
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
46 __libc_lock_define_initialized (static, envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
47 # define LOCK __libc_lock_lock (envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
48 # define UNLOCK __libc_lock_unlock (envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
49 #else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
50 # define LOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
51 # define UNLOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
52 #endif
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
53
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
54 static int
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
55 _unsetenv (const char *name)
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
56 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
57 size_t len;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
58 char **ep;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
59
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
60 if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
61 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
62 __set_errno (EINVAL);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
63 return -1;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
64 }
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
65
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
66 len = strlen (name);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
67
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
68 LOCK;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
69
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
70 ep = environ;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
71 while (*ep != NULL)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
72 if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
73 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
74 /* Found it. Remove this pointer by moving later ones back. */
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
75 char **dp = ep;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
76
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
77 do
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
78 dp[0] = dp[1];
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
79 while (*dp++);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
80 /* Continue the loop in case NAME appears again. */
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
81 }
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
82 else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
83 ++ep;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
84
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
85 UNLOCK;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
86
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
87 return 0;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
88 }
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
89
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
90
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
91 /* Put STRING, which is of the form "NAME=VALUE", in the environment.
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
92 If STRING contains no `=', then remove STRING from the environment. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 int
9434
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
94 putenv (char *string)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 {
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
96 const char *const name_end = strchr (string, '=');
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 register size_t size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 register char **ep;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 if (name_end == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 /* Remove the variable from the environment. */
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
103 return _unsetenv (string);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 size = 0;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
107 for (ep = environ; *ep != NULL; ++ep)
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
108 if (!strncmp (*ep, string, name_end - string) &&
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 (*ep)[name_end - string] == '=')
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 break;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 ++size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 if (*ep == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 static char **last_environ = NULL;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
117 char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 if (new_environ == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 return -1;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
120 (void) memcpy ((void *) new_environ, (void *) environ,
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
121 size * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 new_environ[size] = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 new_environ[size + 1] = NULL;
9749
daf5ba9fe2d9 Remove useless "if" tests before free. Deprecate "free" module.
Jim Meyering <meyering@redhat.com>
parents: 9434
diff changeset
124 free (last_environ);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 last_environ = new_environ;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
126 environ = new_environ;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 else
9434
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
129 *ep = string;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 return 0;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 }