setenv.c 976 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. char *__strchrnul(const char *, int);
  5. int __putenv(char *, size_t, char *);
  6. void __env_rm_add(char *old, char *new)
  7. {
  8. static char **env_alloced;
  9. static size_t env_alloced_n;
  10. for (size_t i=0; i < env_alloced_n; i++)
  11. if (env_alloced[i] == old) {
  12. env_alloced[i] = new;
  13. free(old);
  14. return;
  15. } else if (!env_alloced[i] && new) {
  16. env_alloced[i] = new;
  17. new = 0;
  18. }
  19. if (!new) return;
  20. char **t = realloc(env_alloced, sizeof *t * (env_alloced_n+1));
  21. if (!t) return;
  22. (env_alloced = t)[env_alloced_n++] = new;
  23. }
  24. int setenv(const char *var, const char *value, int overwrite)
  25. {
  26. char *s;
  27. size_t l1, l2;
  28. if (!var || !(l1 = __strchrnul(var, '=') - var) || var[l1]) {
  29. errno = EINVAL;
  30. return -1;
  31. }
  32. if (!overwrite && getenv(var)) return 0;
  33. l2 = strlen(value);
  34. s = malloc(l1+l2+2);
  35. if (!s) return -1;
  36. memcpy(s, var, l1);
  37. s[l1] = '=';
  38. memcpy(s+l1+1, value, l2+1);
  39. return __putenv(s, l1, s);
  40. }