1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <string.h>
3*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
4*c9945492SAndroid Build Coastguard Worker
dummy(char * old,char * new)5*c9945492SAndroid Build Coastguard Worker static void dummy(char *old, char *new) {}
6*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __env_rm_add);
7*c9945492SAndroid Build Coastguard Worker
__putenv(char * s,size_t l,char * r)8*c9945492SAndroid Build Coastguard Worker int __putenv(char *s, size_t l, char *r)
9*c9945492SAndroid Build Coastguard Worker {
10*c9945492SAndroid Build Coastguard Worker size_t i=0;
11*c9945492SAndroid Build Coastguard Worker if (__environ) {
12*c9945492SAndroid Build Coastguard Worker for (char **e = __environ; *e; e++, i++)
13*c9945492SAndroid Build Coastguard Worker if (!strncmp(s, *e, l+1)) {
14*c9945492SAndroid Build Coastguard Worker char *tmp = *e;
15*c9945492SAndroid Build Coastguard Worker *e = s;
16*c9945492SAndroid Build Coastguard Worker __env_rm_add(tmp, r);
17*c9945492SAndroid Build Coastguard Worker return 0;
18*c9945492SAndroid Build Coastguard Worker }
19*c9945492SAndroid Build Coastguard Worker }
20*c9945492SAndroid Build Coastguard Worker static char **oldenv;
21*c9945492SAndroid Build Coastguard Worker char **newenv;
22*c9945492SAndroid Build Coastguard Worker if (__environ == oldenv) {
23*c9945492SAndroid Build Coastguard Worker newenv = realloc(oldenv, sizeof *newenv * (i+2));
24*c9945492SAndroid Build Coastguard Worker if (!newenv) goto oom;
25*c9945492SAndroid Build Coastguard Worker } else {
26*c9945492SAndroid Build Coastguard Worker newenv = malloc(sizeof *newenv * (i+2));
27*c9945492SAndroid Build Coastguard Worker if (!newenv) goto oom;
28*c9945492SAndroid Build Coastguard Worker if (i) memcpy(newenv, __environ, sizeof *newenv * i);
29*c9945492SAndroid Build Coastguard Worker free(oldenv);
30*c9945492SAndroid Build Coastguard Worker }
31*c9945492SAndroid Build Coastguard Worker newenv[i] = s;
32*c9945492SAndroid Build Coastguard Worker newenv[i+1] = 0;
33*c9945492SAndroid Build Coastguard Worker __environ = oldenv = newenv;
34*c9945492SAndroid Build Coastguard Worker if (r) __env_rm_add(0, r);
35*c9945492SAndroid Build Coastguard Worker return 0;
36*c9945492SAndroid Build Coastguard Worker oom:
37*c9945492SAndroid Build Coastguard Worker free(r);
38*c9945492SAndroid Build Coastguard Worker return -1;
39*c9945492SAndroid Build Coastguard Worker }
40*c9945492SAndroid Build Coastguard Worker
putenv(char * s)41*c9945492SAndroid Build Coastguard Worker int putenv(char *s)
42*c9945492SAndroid Build Coastguard Worker {
43*c9945492SAndroid Build Coastguard Worker size_t l = __strchrnul(s, '=') - s;
44*c9945492SAndroid Build Coastguard Worker if (!l || !s[l]) return unsetenv(s);
45*c9945492SAndroid Build Coastguard Worker return __putenv(s, l, 0);
46*c9945492SAndroid Build Coastguard Worker }
47