annotate lib/putenv.c @ 3466:45d73183ee54

Revert some of the previous change; intead, fix the HAVE_GETCWD_NULL code to behave more like the !HAVE_GETCWD_NULL code used to. Include "xalloc.h". (xgetcwd): Do not return NULL when memory is exhausted; instead, invoke xalloc_die.
author Jim Meyering <jim@meyering.net>
date Tue, 04 Sep 2001 20:28:31 +0000
parents 90a1662ba7ec
children df44e79ce676
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2411
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
1 /* Copyright (C) 1991, 1994, 1997, 1998, 2000 Free Software Foundation, Inc.
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
2
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
3 NOTE: The canonical source of this file is maintained with the GNU C
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
4 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
5
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
6 This program is free software; you can redistribute it and/or modify it
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
7 under the terms of the GNU General Public License as published by the
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
9 later version.
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
10
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
11 This program is distributed in the hope that it will be useful,
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
14 GNU General Public License for more details.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
16 You should have received a copy of the GNU General Public License
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
17 along with this program; if not, write to the Free Software Foundation,
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
18 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
19
882
43308e6073b6 libitize
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
20 #if HAVE_CONFIG_H
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
21 # include <config.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
22 #endif
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
23
1229
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
24 #include <sys/types.h>
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
25
2411
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
26 /* 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
27 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
28 #include <errno.h>
90a1662ba7ec Move inclusion of errno.h so it follows that of sys/types.h,
Jim Meyering <jim@meyering.net>
parents: 1570
diff changeset
29
1570
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
30 /* Don't include stdlib.h because some (e.g., Solaris 2.7) declare putenv
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
31 with a non-const argument. That would conflict with the declaration of
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
32 rpl_putenv below (due to the #define putenv rpl_putenv from config.h). */
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
33
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
34 char *malloc ();
0a751006ca02 Don't include stdlib.h and declare malloc and free.
Jim Meyering <jim@meyering.net>
parents: 1556
diff changeset
35 void free ();
1556
44617e0f6ffe Redefine putenv before including stdlib.h to work
Jim Meyering <jim@meyering.net>
parents: 1229
diff changeset
36
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
37 #if defined (__GNU_LIBRARY__) || defined (HAVE_STRING_H)
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
38 # include <string.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
39 #endif
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
40 #if defined (__GNU_LIBRARY__) || defined (HAVE_UNISTD_H)
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
41 # include <unistd.h>
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
42 #endif
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
43
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
44 #if !defined (__GNU_LIBRARY__) && !defined (HAVE_STRCHR)
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
45 # define strchr index
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 #if !defined (__GNU_LIBRARY__) && !defined (HAVE_MEMCPY)
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
48 # define memcpy(d,s,n) bcopy ((s), (d), (n))
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
49 #endif
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
50
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
51 #if HAVE_GNU_LD
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 651
diff changeset
52 # define environ __environ
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
53 #else
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
54 extern char **environ;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
55 #endif
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
56
1229
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
57 #ifndef NULL
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
58 # define NULL 0
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
59 #endif
ed51f6d45a14 (sys/types.h): Include to get size_t on some systems.
Jim Meyering <jim@meyering.net>
parents: 959
diff changeset
60
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
61
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 /* Put STRING, which is of the form "NAME=VALUE", in the environment. */
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 int
1556
44617e0f6ffe Redefine putenv before including stdlib.h to work
Jim Meyering <jim@meyering.net>
parents: 1229
diff changeset
64 rpl_putenv (const char *string)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 {
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
66 const char *const name_end = strchr (string, '=');
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 register size_t size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 register char **ep;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 if (name_end == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 /* Remove the variable from the environment. */
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
73 size = strlen (string);
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
74 for (ep = environ; *ep != NULL; ++ep)
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
75 if (!strncmp (*ep, string, size) && (*ep)[size] == '=')
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 while (ep[1] != NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 ep[0] = ep[1];
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 ++ep;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 *ep = NULL;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 return 0;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 size = 0;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
88 for (ep = environ; *ep != NULL; ++ep)
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
89 if (!strncmp (*ep, string, name_end - string) &&
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 (*ep)[name_end - string] == '=')
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 break;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 ++size;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 if (*ep == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 {
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 static char **last_environ = NULL;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
98 char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 if (new_environ == NULL)
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 return -1;
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
101 (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
102 size * sizeof (char *));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 new_environ[size] = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 new_environ[size + 1] = NULL;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 if (last_environ != NULL)
363
ec4b36233380 Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents: 311
diff changeset
106 free ((void *) last_environ);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 last_environ = new_environ;
311
6980a90dddc9 merge with 1.10n5
Jim Meyering <jim@meyering.net>
parents: 310
diff changeset
108 environ = new_environ;
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 else
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 *ep = (char *) string;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 return 0;
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 }