annotate lib/putenv.c @ 17255:d81be792518a

update from texinfo
author Karl Berry <karl@freefriends.org>
date Tue, 01 Jan 2013 15:51:49 -0800
parents e542fd46ad6f
children a72ac603a92f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16235
diff changeset
1 /* Copyright (C) 1991, 1994, 1997-1998, 2000, 2003-2013 Free Software
12518
b5e42ef33b49 update nearly all FSF copyright year lists to include 2009
Jim Meyering <meyering@redhat.com>
parents: 12421
diff changeset
2 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
15639
6c1f469caade putenv: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
37 #if _LIBC
6c1f469caade putenv: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
38 # if HAVE_GNU_LD
16020
af314a807a78 putenv: indent #definition of "environ" to placate cppi
Jim Meyering <meyering@redhat.com>
parents: 15639
diff changeset
39 # define environ __environ
15639
6c1f469caade putenv: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
40 # else
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
41 extern char **environ;
15639
6c1f469caade putenv: Support for MSVC.
Bruno Haible <bruno@clisp.org>
parents: 14079
diff changeset
42 # endif
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
43 #endif
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
44
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
45 #if _LIBC
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
46 /* This lock protects against simultaneous modifications of 'environ'. */
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
47 # include <bits/libc-lock.h>
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
48 __libc_lock_define_initialized (static, envlock)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
49 # define LOCK __libc_lock_lock (envlock)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
50 # define UNLOCK __libc_lock_unlock (envlock)
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
51 #else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
52 # define LOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
53 # define UNLOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
54 #endif
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
55
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
56 static int
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
57 _unsetenv (const char *name)
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
58 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
59 size_t len;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
60 char **ep;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
61
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
62 if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
63 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
64 __set_errno (EINVAL);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
65 return -1;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
66 }
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 len = strlen (name);
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 LOCK;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
71
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
72 ep = environ;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
73 while (*ep != NULL)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
74 if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
75 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
76 /* Found it. Remove this pointer by moving later ones back. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
77 char **dp = ep;
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
78
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
79 do
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
80 dp[0] = dp[1];
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
81 while (*dp++);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
82 /* Continue the loop in case NAME appears again. */
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
83 }
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
84 else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
85 ++ep;
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 UNLOCK;
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 return 0;
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
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
92
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
93 /* Put STRING, which is of the form "NAME=VALUE", in the environment.
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
94 If STRING contains no '=', then remove STRING from the environment. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 int
9434
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
96 putenv (char *string)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 {
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
98 const char *const name_end = strchr (string, '=');
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 register size_t size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 register char **ep;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 if (name_end == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 /* Remove the variable from the environment. */
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
105 return _unsetenv (string);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 size = 0;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
109 for (ep = environ; *ep != NULL; ++ep)
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
110 if (!strncmp (*ep, string, name_end - string) &&
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
111 (*ep)[name_end - string] == '=')
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 break;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 ++size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 if (*ep == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 static char **last_environ = NULL;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
119 char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 if (new_environ == NULL)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
121 return -1;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
122 (void) memcpy ((void *) new_environ, (void *) environ,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10384
diff changeset
123 size * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 new_environ[size] = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 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
126 free (last_environ);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 last_environ = new_environ;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
128 environ = new_environ;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 else
9434
b839560eec9f Define the putenv substitute in <stdlib.h> rather than in <config.h>.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
131 *ep = string;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 return 0;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 }