#include #include #include "libc.h" char *__strchrnul(const char *, int); int __unsetenv(const char *, size_t, char **); static void dummy(char *p, char *r) {} weak_alias(dummy, __env_change); int __putenv(char *s, size_t l, char *r) { size_t i=0; if (__environ) for (; __environ[i]; i++) if (!strncmp(__environ[i], s, l+1)) { char *tmp = __environ[i]; __environ[i] = s; __env_change(tmp, r); return __unsetenv(s, l, __environ+i+1); } static char **oldenv; char **newenv; if (__environ == oldenv) { newenv = realloc(oldenv, sizeof *newenv * (i+2)); if (!newenv) goto oom; } else { newenv = malloc(sizeof *newenv * (i+2)); if (!newenv) goto oom; if (i) memcpy(newenv, __environ, sizeof *newenv * i); free(oldenv); } newenv[i] = s; newenv[i+1] = 0; __environ = oldenv = newenv; if (r) __env_change(0, r); return 0; oom: free(r); return -1; } int putenv(char *s) { size_t l = __strchrnul(s, '=') - s; if (!l || !s[l]) return unsetenv(s); return __putenv(s, l, 0); }