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