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