4.4BSD snapshot (revision 8.1)
[unix-history] / usr / src / lib / libc / stdlib / setenv.c
CommitLineData
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 9static 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
16char *__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 */
23setenv(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 */
78void
79unsetenv(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}