annotate lib/putenv.c @ 8234:e488ab5dfa4f

Avoid conflicting types for 'unsetenv' on FreeBSD. * lib/putenv.c (_unsetenv): Rename from "unsetenv", to avoid conflicting with FreeBSD's (5.0 and 6.1) function declaration in stdlib.h.
author Jim Meyering <jim@meyering.net>
date Sun, 25 Feb 2007 00:47:36 +0000
parents 822e9380142e
children bbbbbf4cd1c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
1 /* Copyright (C) 1991, 1994, 1997, 1998, 2000, 2003, 2004, 2005, 2006, 2007
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
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
7 This program is free software; you can redistribute it and/or modify it
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
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
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
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
18 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
20
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
21 #include <config.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
22
8214
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
23 /* undef putenv here, because some (e.g., Solaris 10) declare putenv in
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
24 with a non-const argument. That would conflict with the declaration of
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
25 rpl_putenv below (due to the #define putenv rpl_putenv from config.h). */
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
26 #undef putenv
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
27 int rpl_putenv (char const *);
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
28
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
29 #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
30
2411
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
31 /* 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
32 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
33 #include <errno.h>
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4672
diff changeset
34 #ifndef __set_errno
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
35 # define __set_errno(ev) ((errno) = (ev))
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
36 #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
37
8214
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
38 #include <stdlib.h>
4672
55a4d3c67ca7 Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4486
diff changeset
39 #include <string.h>
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
40 #include <unistd.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
41
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
42 #if HAVE_GNU_LD
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
43 # define environ __environ
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
44 #else
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
45 extern char **environ;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
46 #endif
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
47
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
48 #if _LIBC
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
49 /* This lock protects against simultaneous modifications of `environ'. */
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
50 # include <bits/libc-lock.h>
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
51 __libc_lock_define_initialized (static, envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
52 # define LOCK __libc_lock_lock (envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
53 # define UNLOCK __libc_lock_unlock (envlock)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
54 #else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
55 # define LOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
56 # define UNLOCK
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
57 #endif
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 static int
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
60 _unsetenv (const char *name)
4364
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 size_t len;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
63 char **ep;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
64
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
65 if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
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 __set_errno (EINVAL);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
68 return -1;
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
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
71 len = strlen (name);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
72
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
73 LOCK;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
74
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
75 ep = environ;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
76 while (*ep != NULL)
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
77 if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
78 {
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
79 /* Found it. Remove this pointer by moving later ones back. */
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
80 char **dp = ep;
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 do
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
83 dp[0] = dp[1];
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
84 while (*dp++);
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
85 /* Continue the loop in case NAME appears again. */
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 else
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
88 ++ep;
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 UNLOCK;
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 return 0;
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
93 }
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
94
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
95
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
96 /* 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
97 If STRING contains no `=', then remove STRING from the environment. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 int
1556
44617e0f6ffe Redefine putenv before including stdlib.h to work
Jim Meyering <jim@meyering.net>
parents: 1229
diff changeset
99 rpl_putenv (const char *string)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 {
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
101 const char *const name_end = strchr (string, '=');
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 register size_t size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 register char **ep;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 if (name_end == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 /* Remove the variable from the environment. */
8234
e488ab5dfa4f Avoid conflicting types for 'unsetenv' on FreeBSD.
Jim Meyering <jim@meyering.net>
parents: 8214
diff changeset
108 return _unsetenv (string);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 size = 0;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
112 for (ep = environ; *ep != NULL; ++ep)
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
113 if (!strncmp (*ep, string, name_end - string) &&
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 (*ep)[name_end - string] == '=')
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 break;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 ++size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 if (*ep == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 static char **last_environ = NULL;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
122 char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 if (new_environ == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 return -1;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
125 (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
126 size * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 new_environ[size] = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 new_environ[size + 1] = NULL;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 if (last_environ != NULL)
4364
842bd108d7f6 Merge from coreutils.
Jim Meyering <jim@meyering.net>
parents: 4347
diff changeset
130 free (last_environ);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 last_environ = new_environ;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
132 environ = new_environ;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 *ep = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 return 0;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 }