181a41810bc2e4b39a3aefbae4300ffc0c3bd685
[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 *end = strchr(s, '=');
13         size_t l = end-s+1;
14         char **newenv = 0;
15         char **newmap = 0;
16         static char **oldenv;
17         
18         if (!end || l == 1) return -1;
19         for (; __environ[i] && memcmp(s, __environ[i], l); 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 }