a7dd2b602fc96a23181f37bf10c3729192851c94
[musl] / src / env / setenv.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <errno.h>
4
5 char *__strchrnul(const char *, int);
6 int __putenv(char *, size_t, char *);
7
8 void __env_rm_add(char *old, char *new)
9 {
10         static char **env_alloced;
11         static size_t env_alloced_n;
12         for (size_t i=0; i < env_alloced_n; i++)
13                 if (env_alloced[i] == old) {
14                         env_alloced[i] = new;
15                         free(old);
16                         return;
17                 } else if (!env_alloced[i] && new) {
18                         env_alloced[i] = new;
19                         new = 0;
20                 }
21         if (!new) return;
22         char **t = realloc(env_alloced, sizeof *t * (env_alloced_n+1));
23         if (!t) return;
24         (env_alloced = t)[env_alloced_n++] = new;
25 }
26
27 int setenv(const char *var, const char *value, int overwrite)
28 {
29         char *s;
30         size_t l1, l2;
31
32         if (!var || !(l1 = __strchrnul(var, '=') - var) || var[l1]) {
33                 errno = EINVAL;
34                 return -1;
35         }
36         if (!overwrite && getenv(var)) return 0;
37
38         l2 = strlen(value);
39         s = malloc(l1+l2+2);
40         if (!s) return -1;
41         memcpy(s, var, l1);
42         s[l1] = '=';
43         memcpy(s+l1+1, value, l2+1);
44         return __putenv(s, l1, s);
45 }