diff options
Diffstat (limited to 'src/env/unsetenv.c')
-rw-r--r-- | src/env/unsetenv.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/env/unsetenv.c b/src/env/unsetenv.c new file mode 100644 index 0000000..b14c4c9 --- /dev/null +++ b/src/env/unsetenv.c @@ -0,0 +1,28 @@ +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> + +static void dummy(char *old, char *new) {} +weak_alias(dummy, __env_rm_add); + +int unsetenv(const char *name) +{ + size_t l = __strchrnul(name, '=') - name; + if (!l || name[l]) { + errno = EINVAL; + return -1; + } + if (__environ) { + char **e = __environ, **eo = e; + for (; *e; e++) + if (!strncmp(name, *e, l) && l[*e] == '=') + __env_rm_add(*e, 0); + else if (eo != e) + *eo++ = *e; + else + eo++; + if (eo != e) *eo = 0; + } + return 0; +} |