| Index: fusl/src/env/putenv.c
|
| diff --git a/fusl/src/env/putenv.c b/fusl/src/env/putenv.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4042869b500f1866e111918f121ba3d08d962287
|
| --- /dev/null
|
| +++ b/fusl/src/env/putenv.c
|
| @@ -0,0 +1,57 @@
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +
|
| +extern char **__environ;
|
| +char **__env_map;
|
| +
|
| +int __putenv(char *s, int a)
|
| +{
|
| + int i=0, j=0;
|
| + char *z = strchr(s, '=');
|
| + char **newenv = 0;
|
| + char **newmap = 0;
|
| + static char **oldenv;
|
| +
|
| + if (!z) return unsetenv(s);
|
| + if (z==s) return -1;
|
| + for (; __environ[i] && memcmp(s, __environ[i], z-s+1); i++);
|
| + if (a) {
|
| + if (!__env_map) {
|
| + __env_map = calloc(2, sizeof(char *));
|
| + if (__env_map) __env_map[0] = s;
|
| + } else {
|
| + for (; __env_map[j] && __env_map[j] != __environ[i]; j++);
|
| + if (!__env_map[j]) {
|
| + newmap = realloc(__env_map, sizeof(char *)*(j+2));
|
| + if (newmap) {
|
| + __env_map = newmap;
|
| + __env_map[j] = s;
|
| + __env_map[j+1] = NULL;
|
| + }
|
| + } else {
|
| + free(__env_map[j]);
|
| + }
|
| + }
|
| + }
|
| + if (!__environ[i]) {
|
| + newenv = malloc(sizeof(char *)*(i+2));
|
| + if (!newenv) {
|
| + if (a && __env_map) __env_map[j] = 0;
|
| + return -1;
|
| + }
|
| + memcpy(newenv, __environ, sizeof(char *)*i);
|
| + newenv[i] = s;
|
| + newenv[i+1] = 0;
|
| + __environ = newenv;
|
| + free(oldenv);
|
| + oldenv = __environ;
|
| + }
|
| +
|
| + __environ[i] = s;
|
| + return 0;
|
| +}
|
| +
|
| +int putenv(char *s)
|
| +{
|
| + return __putenv(s, 0);
|
| +}
|
|
|