diff options
| author | Andrey A. Chernov <ache@FreeBSD.org> | 2007-05-01 16:02:44 +0000 |
|---|---|---|
| committer | Andrey A. Chernov <ache@FreeBSD.org> | 2007-05-01 16:02:44 +0000 |
| commit | ba174a5e38b1ab764c4a36ef4dd83e80c4add148 (patch) | |
| tree | e3e0b3658b8df3a905b3117d8535bb15f42c9e80 /lib/libc/stdlib/putenv.c | |
| parent | 8d497697b2ae8684e3ac94eff8bb9ce60dc14a3e (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdlib/putenv.c')
| -rw-r--r-- | lib/libc/stdlib/putenv.c | 48 |
1 files changed, 11 insertions, 37 deletions
diff --git a/lib/libc/stdlib/putenv.c b/lib/libc/stdlib/putenv.c index 56b78cffd202..a5eea5d0ddfd 100644 --- a/lib/libc/stdlib/putenv.c +++ b/lib/libc/stdlib/putenv.c @@ -33,50 +33,24 @@ static char sccsid[] = "@(#)putenv.c 8.2 (Berkeley) 3/27/94"; #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <errno.h> #include <stdlib.h> #include <string.h> -extern char **__alloced; /* if allocated space before */ - -char *__findenv(const char *, int *); - int putenv(str) - char *str; + const char *str; { - extern char **environ; - char *eq; - int offset; + char *p, *equal; + int rval; - if (str == NULL || (eq = strchr(str, '=')) == NULL || eq == str) { - errno = EINVAL; + if ((p = strdup(str)) == NULL) + return (-1); + if ((equal = index(p, '=')) == NULL) { + (void)free(p); return (-1); } - - /* Trimmed version of setenv(3). */ - if (__findenv(str, &offset) == NULL) { - int cnt; - char **p; - - for (p = environ, cnt = 0; *p; ++p, ++cnt); - if (__alloced == environ) { /* just increase size */ - p = (char **)realloc((char *)environ, - (size_t)(sizeof(char *) * (cnt + 2))); - if (!p) - return (-1); - } - else { /* get new space */ - /* copy old entries into it */ - p = (char **)malloc((size_t)(sizeof(char *) * (cnt + 2))); - if (!p) - return (-1); - bcopy(environ, p, cnt * sizeof(char *)); - } - __alloced = environ = p; - environ[cnt + 1] = NULL; - offset = cnt; - } - environ[offset] = str; - return (0); + *equal = '\0'; + rval = setenv(p, equal + 1, 1); + (void)free(p); + return (rval); } |
