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