blob: 0e42cd8ef5219ae6c0c2bd49cb6f995e5cfef712 [file] [log] [blame]
#include <stdlib.h>
#include <string.h>
#include "libc.h"
#include "env_impl.h"
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]);
__env_map[j] = s;
}
}
}
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);
}