Commit | Line | Data |
---|---|---|
fd08e5b9 | 1 | /* |
7860c229 KB |
2 | * Copyright (c) 1987, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
fd08e5b9 | 4 | * |
019bea33 | 5 | * %sccs.include.redist.c% |
fd08e5b9 KB |
6 | */ |
7 | ||
8 | #if defined(LIBC_SCCS) && !defined(lint) | |
7860c229 | 9 | static char sccsid[] = "@(#)setenv.c 8.1 (Berkeley) %G%"; |
fd08e5b9 KB |
10 | #endif /* LIBC_SCCS and not lint */ |
11 | ||
48780a31 KB |
12 | #include <stddef.h> |
13 | #include <stdlib.h> | |
f0a345ab | 14 | #include <string.h> |
fd08e5b9 | 15 | |
18b22690 KB |
16 | char *__findenv __P((const char *, int *)); |
17 | ||
fd08e5b9 KB |
18 | /* |
19 | * setenv -- | |
20 | * Set the value of the environmental variable "name" to be | |
21 | * "value". If rewrite is set, replace any current value. | |
22 | */ | |
23 | setenv(name, value, rewrite) | |
f0a345ab DS |
24 | register const char *name; |
25 | register const char *value; | |
fd08e5b9 KB |
26 | int rewrite; |
27 | { | |
28 | extern char **environ; | |
29 | static int alloced; /* if allocated space before */ | |
18b22690 | 30 | register char *c; |
fd08e5b9 | 31 | int l_value, offset; |
fd08e5b9 KB |
32 | |
33 | if (*value == '=') /* no `=' in value */ | |
34 | ++value; | |
35 | l_value = strlen(value); | |
18b22690 | 36 | if ((c = __findenv(name, &offset))) { /* find if already exists */ |
fd08e5b9 | 37 | if (!rewrite) |
8d2528a9 | 38 | return (0); |
18b22690 KB |
39 | if (strlen(c) >= l_value) { /* old larger; copy over */ |
40 | while (*c++ = *value++); | |
8d2528a9 | 41 | return (0); |
fd08e5b9 | 42 | } |
8d2528a9 | 43 | } else { /* create new slot */ |
18b22690 KB |
44 | register int cnt; |
45 | register char **p; | |
fd08e5b9 | 46 | |
18b22690 | 47 | for (p = environ, cnt = 0; *p; ++p, ++cnt); |
fd08e5b9 KB |
48 | if (alloced) { /* just increase size */ |
49 | environ = (char **)realloc((char *)environ, | |
48780a31 | 50 | (size_t)(sizeof(char *) * (cnt + 2))); |
fd08e5b9 | 51 | if (!environ) |
8d2528a9 | 52 | return (-1); |
fd08e5b9 KB |
53 | } |
54 | else { /* get new space */ | |
55 | alloced = 1; /* copy old entries into it */ | |
18b22690 KB |
56 | p = malloc((size_t)(sizeof(char *) * (cnt + 2))); |
57 | if (!p) | |
8d2528a9 | 58 | return (-1); |
18b22690 KB |
59 | bcopy(environ, p, cnt * sizeof(char *)); |
60 | environ = p; | |
fd08e5b9 KB |
61 | } |
62 | environ[cnt + 1] = NULL; | |
63 | offset = cnt; | |
64 | } | |
18b22690 | 65 | for (c = (char *)name; *c && *c != '='; ++c); /* no `=' in name */ |
fd08e5b9 | 66 | if (!(environ[offset] = /* name + `=' + value */ |
18b22690 | 67 | malloc((size_t)((int)(c - name) + l_value + 2)))) |
8d2528a9 | 68 | return (-1); |
18b22690 KB |
69 | for (c = environ[offset]; (*c = *name++) && *c != '='; ++c); |
70 | for (*c++ = '='; *c++ = *value++;); | |
8d2528a9 | 71 | return (0); |
fd08e5b9 KB |
72 | } |
73 | ||
74 | /* | |
75 | * unsetenv(name) -- | |
76 | * Delete environmental variable "name". | |
77 | */ | |
78 | void | |
79 | unsetenv(name) | |
18b22690 | 80 | const char *name; |
fd08e5b9 | 81 | { |
48780a31 | 82 | extern char **environ; |
18b22690 | 83 | register char **p; |
48780a31 | 84 | int offset; |
fd08e5b9 | 85 | |
18b22690 KB |
86 | while (__findenv(name, &offset)) /* if set multiple times */ |
87 | for (p = &environ[offset];; ++p) | |
88 | if (!(*p = *(p + 1))) | |
fd08e5b9 KB |
89 | break; |
90 | } |