setenv.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>
  2. * This file is part of the Linux-8086 C library and is distributed
  3. * under the GNU Library General Public License.
  4. */
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <malloc.h>
  8. extern char **environ;
  9. #define ADD_NUM 4
  10. int setenv(var, value, overwrite)
  11. const char *var;
  12. const char *value;
  13. int overwrite;
  14. {
  15. static char **mall_env = 0;
  16. static int extras = 0;
  17. char **p, **d;
  18. char *t;
  19. int len;
  20. len = strlen(var);
  21. if (!environ) {
  22. environ = (char **) malloc(ADD_NUM * sizeof(char *));
  23. memset(environ, 0, sizeof(char *) * ADD_NUM);
  24. extras = ADD_NUM;
  25. }
  26. for (p = environ; *p; p++) {
  27. if (memcmp(var, *p, len) == 0 && (*p)[len] == '=') {
  28. if (!overwrite)
  29. return -1;
  30. /* Overwrite stuff */
  31. while ((p[0] = p[1]))
  32. p++;
  33. extras++;
  34. break;
  35. }
  36. }
  37. if (extras <= 0) { /* Need more space */
  38. d = malloc((p - environ + 1 + ADD_NUM) * sizeof(char *));
  39. if (d == 0)
  40. return -1;
  41. memcpy((void *) d, (void *) environ,
  42. (p - environ + 1) * sizeof(char *));
  43. p = d + (p - environ);
  44. extras = ADD_NUM;
  45. if (mall_env)
  46. free(mall_env);
  47. environ = d;
  48. mall_env = d;
  49. }
  50. t = malloc(len + 1 + strlen(value) + 1);
  51. if (!t)
  52. return -1;
  53. strcpy(t, var);
  54. strcat(t, "=");
  55. strcat(t, value);
  56. *p++ = (char *) t;
  57. *p = '\0';
  58. extras--;
  59. return 0;
  60. }