| #include <stdlib.h> |
| #include <string.h> |
| #include <errno.h> |
| |
| extern char** __environ; |
| extern char** __env_map; |
| |
| int unsetenv(const char* name) { |
| int i, j; |
| size_t l = strlen(name); |
| |
| if (!*name || strchr(name, '=')) { |
| errno = EINVAL; |
| return -1; |
| } |
| again: |
| for (i = 0; __environ[i] && |
| (memcmp(name, __environ[i], l) || __environ[i][l] != '='); |
| i++) |
| ; |
| if (__environ[i]) { |
| if (__env_map) { |
| for (j = 0; __env_map[j] && __env_map[j] != __environ[i]; j++) |
| ; |
| free(__env_map[j]); |
| for (; __env_map[j]; j++) |
| __env_map[j] = __env_map[j + 1]; |
| } |
| for (; __environ[i]; i++) |
| __environ[i] = __environ[i + 1]; |
| goto again; |
| } |
| return 0; |
| } |