unsetenv.c 640 B

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