1990-01-03 17:23:10 +00:00
|
|
|
/*
|
|
|
|
* (c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*/
|
1994-06-24 14:02:31 +00:00
|
|
|
/* $Id$ */
|
1990-01-03 17:23:10 +00:00
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#define ENTRY_INC 10
|
|
|
|
#define rounded(x) (((x / ENTRY_INC) + 1) * ENTRY_INC)
|
|
|
|
|
2013-05-29 20:41:58 +00:00
|
|
|
extern char **environ;
|
1990-01-03 17:23:10 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
putenv(char *name)
|
|
|
|
{
|
2013-05-29 20:41:58 +00:00
|
|
|
register char **v = environ;
|
1990-01-03 17:23:10 +00:00
|
|
|
register char *r;
|
|
|
|
static int size = 0;
|
|
|
|
/* When size != 0, it contains the number of entries in the
|
|
|
|
* table (including the final NULL pointer). This means that the
|
2013-05-29 20:41:58 +00:00
|
|
|
* last non-null entry is environ[size - 2].
|
1990-01-03 17:23:10 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
if (!name) return 0;
|
1990-01-04 08:39:10 +00:00
|
|
|
if (r = strchr(name, '=')) {
|
1990-01-03 17:23:10 +00:00
|
|
|
register const char *p, *q;
|
|
|
|
|
|
|
|
*r = '\0';
|
|
|
|
|
|
|
|
if (v != NULL) {
|
|
|
|
while ((p = *v) != NULL) {
|
|
|
|
q = name;
|
|
|
|
while (*q && (*q++ == *p++))
|
|
|
|
/* EMPTY */ ;
|
|
|
|
if (*q || (*p != '=')) {
|
|
|
|
v++;
|
|
|
|
} else {
|
|
|
|
/* The name was already in the
|
|
|
|
* environment.
|
|
|
|
*/
|
|
|
|
*r = '=';
|
|
|
|
*v = name;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1990-05-14 12:30:18 +00:00
|
|
|
*r = '=';
|
2013-05-29 20:41:58 +00:00
|
|
|
v = environ;
|
1990-01-03 17:23:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!size) {
|
2013-05-29 20:41:58 +00:00
|
|
|
register char **p;
|
1990-01-03 17:23:10 +00:00
|
|
|
register int i = 0;
|
|
|
|
|
|
|
|
if (v)
|
|
|
|
do {
|
|
|
|
i++;
|
|
|
|
} while (*v++);
|
|
|
|
if (!(v = malloc(rounded(i) * sizeof(char **))))
|
|
|
|
return 1;
|
|
|
|
size = i;
|
2013-05-29 20:41:58 +00:00
|
|
|
p = environ;
|
|
|
|
environ = v;
|
1990-01-03 17:23:10 +00:00
|
|
|
while (*v++ = *p++); /* copy the environment */
|
2013-05-29 20:41:58 +00:00
|
|
|
v = environ;
|
1990-01-03 17:23:10 +00:00
|
|
|
} else if (!(size % ENTRY_INC)) {
|
2013-05-29 20:41:58 +00:00
|
|
|
if (!(v = realloc(environ, rounded(size) * sizeof(char **))))
|
1990-01-03 17:23:10 +00:00
|
|
|
return 1;
|
2013-05-29 20:41:58 +00:00
|
|
|
environ = v;
|
1990-01-03 17:23:10 +00:00
|
|
|
}
|
|
|
|
v[size - 1] = name;
|
|
|
|
v[size] = NULL;
|
|
|
|
size++;
|
|
|
|
return 0;
|
|
|
|
}
|