summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/setenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/setenv.c')
-rw-r--r--src/lib/libc/stdlib/setenv.c75
1 files changed, 29 insertions, 46 deletions
diff --git a/src/lib/libc/stdlib/setenv.c b/src/lib/libc/stdlib/setenv.c
index a36669888d..36540ebb0c 100644
--- a/src/lib/libc/stdlib/setenv.c
+++ b/src/lib/libc/stdlib/setenv.c
@@ -1,3 +1,4 @@
1/* $OpenBSD: setenv.c,v 1.9 2005/08/08 08:05:37 espie Exp $ */
1/* 2/*
2 * Copyright (c) 1987 Regents of the University of California. 3 * Copyright (c) 1987 Regents of the University of California.
3 * All rights reserved. 4 * All rights reserved.
@@ -10,11 +11,7 @@
10 * 2. Redistributions in binary form must reproduce the above copyright 11 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the 12 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution. 13 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software 14 * 3. Neither the name of the University nor the names of its contributors
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software 15 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission. 16 * without specific prior written permission.
20 * 17 *
@@ -31,30 +28,24 @@
31 * SUCH DAMAGE. 28 * SUCH DAMAGE.
32 */ 29 */
33 30
34#if defined(LIBC_SCCS) && !defined(lint)
35/*static char *sccsid = "from: @(#)setenv.c 5.6 (Berkeley) 6/4/91";*/
36static char *rcsid = "$Id: setenv.c,v 1.1.1.1 1995/10/18 08:42:19 deraadt Exp $";
37#endif /* LIBC_SCCS and not lint */
38
39#include <stdlib.h> 31#include <stdlib.h>
40#include <string.h> 32#include <string.h>
41 33
34char *__findenv(const char *name, int *offset);
35
36extern char **environ;
37
42/* 38/*
43 * setenv -- 39 * setenv --
44 * Set the value of the environmental variable "name" to be 40 * Set the value of the environmental variable "name" to be
45 * "value". If rewrite is set, replace any current value. 41 * "value". If rewrite is set, replace any current value.
46 */ 42 */
47int 43int
48setenv(name, value, rewrite) 44setenv(const char *name, const char *value, int rewrite)
49 register const char *name;
50 register const char *value;
51 int rewrite;
52{ 45{
53 extern char **environ; 46 static char **lastenv; /* last value of environ */
54 static int alloced; /* if allocated space before */ 47 char *C;
55 register char *C;
56 int l_value, offset; 48 int l_value, offset;
57 char *__findenv();
58 49
59 if (*value == '=') /* no `=' in value */ 50 if (*value == '=') /* no `=' in value */
60 ++value; 51 ++value;
@@ -63,39 +54,34 @@ setenv(name, value, rewrite)
63 if (!rewrite) 54 if (!rewrite)
64 return (0); 55 return (0);
65 if (strlen(C) >= l_value) { /* old larger; copy over */ 56 if (strlen(C) >= l_value) { /* old larger; copy over */
66 while (*C++ = *value++); 57 while ((*C++ = *value++))
58 ;
67 return (0); 59 return (0);
68 } 60 }
69 } else { /* create new slot */ 61 } else { /* create new slot */
70 register int cnt; 62 size_t cnt;
71 register char **P; 63 char **P;
72 64
73 for (P = environ, cnt = 0; *P; ++P, ++cnt); 65 for (P = environ; *P != NULL; P++)
74 if (alloced) { /* just increase size */ 66 ;
75 environ = (char **)realloc((char *)environ, 67 cnt = P - environ;
76 (size_t)(sizeof(char *) * (cnt + 2))); 68 P = (char **)realloc(lastenv, sizeof(char *) * (cnt + 2));
77 if (!environ) 69 if (!P)
78 return (-1); 70 return (-1);
79 } 71 if (lastenv != environ)
80 else { /* get new space */ 72 memcpy(P, environ, cnt * sizeof(char *));
81 alloced = 1; /* copy old entries into it */ 73 lastenv = environ = P;
82 P = (char **)malloc((size_t)(sizeof(char *) *
83 (cnt + 2)));
84 if (!P)
85 return (-1);
86 bcopy(environ, P, cnt * sizeof(char *));
87 environ = P;
88 }
89 environ[cnt + 1] = NULL;
90 offset = cnt; 74 offset = cnt;
75 environ[cnt + 1] = NULL;
91 } 76 }
92 for (C = (char *)name; *C && *C != '='; ++C); /* no `=' in name */ 77 for (C = (char *)name; *C && *C != '='; ++C)
78 ; /* no `=' in name */
93 if (!(environ[offset] = /* name + `=' + value */ 79 if (!(environ[offset] = /* name + `=' + value */
94 malloc((size_t)((int)(C - name) + l_value + 2)))) 80 malloc((size_t)((int)(C - name) + l_value + 2))))
95 return (-1); 81 return (-1);
96 for (C = environ[offset]; (*C = *name++) && *C != '='; ++C) 82 for (C = environ[offset]; (*C = *name++) && *C != '='; ++C)
97 ; 83 ;
98 for (*C++ = '='; *C++ = *value++; ) 84 for (*C++ = '='; (*C++ = *value++); )
99 ; 85 ;
100 return (0); 86 return (0);
101} 87}
@@ -105,15 +91,12 @@ setenv(name, value, rewrite)
105 * Delete environmental variable "name". 91 * Delete environmental variable "name".
106 */ 92 */
107void 93void
108unsetenv(name) 94unsetenv(const char *name)
109 const char *name;
110{ 95{
111 extern char **environ; 96 char **P;
112 register char **P;
113 int offset; 97 int offset;
114 char *__findenv();
115 98
116 while (__findenv(name, &offset)) /* if set multiple times */ 99 while (__findenv(name, &offset)) /* if set multiple times */
117 for (P = &environ[offset];; ++P) 100 for (P = &environ[offset];; ++P)
118 if (!(*P = *(P + 1))) 101 if (!(*P = *(P + 1)))
119 break; 102 break;