xref: /aosp_15_r20/external/musl/src/env/setenv.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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