1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "libc.h"
5 #include "env_impl.h"
6
7 char** __env_map;
8
__putenv(char * s,int a)9 int __putenv(char* s, int a) {
10 int i = 0, j = 0;
11 char* z = strchr(s, '=');
12 char** newenv = 0;
13 char** newmap = 0;
14 static char** oldenv;
15
16 if (!z)
17 return unsetenv(s);
18 if (z == s)
19 return -1;
20 for (; __environ[i] && memcmp(s, __environ[i], z - s + 1); i++)
21 ;
22 if (a) {
23 if (!__env_map) {
24 __env_map = calloc(2, sizeof(char*));
25 if (__env_map)
26 __env_map[0] = s;
27 } else {
28 for (; __env_map[j] && __env_map[j] != __environ[i]; j++)
29 ;
30 if (!__env_map[j]) {
31 newmap = realloc(__env_map, sizeof(char*) * (j + 2));
32 if (newmap) {
33 __env_map = newmap;
34 __env_map[j] = s;
35 __env_map[j + 1] = NULL;
36 }
37 } else {
38 free(__env_map[j]);
39 __env_map[j] = s;
40 }
41 }
42 }
43 if (!__environ[i]) {
44 newenv = malloc(sizeof(char*) * (i + 2));
45 if (!newenv) {
46 if (a && __env_map)
47 __env_map[j] = 0;
48 return -1;
49 }
50 memcpy(newenv, __environ, sizeof(char*) * i);
51 newenv[i] = s;
52 newenv[i + 1] = 0;
53 __environ = newenv;
54 free(oldenv);
55 oldenv = __environ;
56 }
57
58 __environ[i] = s;
59 return 0;
60 }
61
putenv(char * s)62 int putenv(char* s) {
63 return __putenv(s, 0);
64 }
65