1#include <errno.h>
2#include <stdlib.h>
3#include <string.h>
4
5#include "env_impl.h"
6#include "libc.h"
7
8int unsetenv(const char* name) {
9    int i, j;
10    size_t l = strlen(name);
11
12    if (!*name || strchr(name, '=')) {
13        errno = EINVAL;
14        return -1;
15    }
16again:
17    for (i = 0; __environ[i] && (memcmp(name, __environ[i], l) || __environ[i][l] != '='); i++)
18        ;
19    if (__environ[i]) {
20        if (__env_map) {
21            for (j = 0; __env_map[j] && __env_map[j] != __environ[i]; j++)
22                ;
23            free(__env_map[j]);
24            for (; __env_map[j]; j++)
25                __env_map[j] = __env_map[j + 1];
26        }
27        for (; __environ[i]; i++)
28            __environ[i] = __environ[i + 1];
29        goto again;
30    }
31    return 0;
32}
33