blob: 7f6caa4a0608aaea1de737ec9d0cc6c86b996d40 [file] [log] [blame]
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08001#include <stdlib.h>
2#include <string.h>
3
George Kulakowski17e3b042016-02-18 15:59:50 -08004extern char** __environ;
5char** __env_map;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08006
George Kulakowski17e3b042016-02-18 15:59:50 -08007int __putenv(char* s, int a) {
8 int i = 0, j = 0;
9 char* z = strchr(s, '=');
10 char** newenv = 0;
11 char** newmap = 0;
12 static char** oldenv;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080013
George Kulakowski17e3b042016-02-18 15:59:50 -080014 if (!z)
15 return unsetenv(s);
16 if (z == s)
17 return -1;
18 for (; __environ[i] && memcmp(s, __environ[i], z - s + 1); i++)
19 ;
20 if (a) {
21 if (!__env_map) {
22 __env_map = calloc(2, sizeof(char*));
23 if (__env_map)
24 __env_map[0] = s;
25 } else {
26 for (; __env_map[j] && __env_map[j] != __environ[i]; j++)
27 ;
28 if (!__env_map[j]) {
29 newmap = realloc(__env_map, sizeof(char*) * (j + 2));
30 if (newmap) {
31 __env_map = newmap;
32 __env_map[j] = s;
33 __env_map[j + 1] = NULL;
34 }
35 } else {
36 free(__env_map[j]);
37 }
38 }
39 }
40 if (!__environ[i]) {
41 newenv = malloc(sizeof(char*) * (i + 2));
42 if (!newenv) {
43 if (a && __env_map)
44 __env_map[j] = 0;
45 return -1;
46 }
47 memcpy(newenv, __environ, sizeof(char*) * i);
48 newenv[i] = s;
49 newenv[i + 1] = 0;
50 __environ = newenv;
51 free(oldenv);
52 oldenv = __environ;
53 }
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080054
George Kulakowski17e3b042016-02-18 15:59:50 -080055 __environ[i] = s;
56 return 0;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080057}
58
George Kulakowski17e3b042016-02-18 15:59:50 -080059int putenv(char* s) {
60 return __putenv(s, 0);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080061}