setenv.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:2k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /* Copyright (C) 1995, 1996 by Sven Berkvens (sven@stack.nl) */
  2. #include "config.h"
  3. #ifndef HAVE_SETENV
  4. #include <stddef.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include "setenv.h"
  9. #include "string.h"
  10. #ifndef NOFORWARDS
  11. static char *findenv  PROTO((const char *, int *));
  12. #endif /* NOFORWARDS */
  13. #ifdef NEED_DECL_ENVIRON
  14. extern char **environ;
  15. #endif /* NEED_DECL_ENVIRON */
  16. extern char *
  17. getenv DECL1C(char *, name)
  18. {
  19. int offset;
  20. return(findenv(name, &offset));
  21. }
  22. static char *
  23. findenv DECL2C_(char *, name, int *, offset)
  24. {
  25. int len;
  26. const char *np;
  27. char **p, *c;
  28. if (!name || !environ)
  29. return(NULL);
  30. for (np = name; *np && (*np != '='); ++np)
  31. continue;
  32. len = np - name;
  33. for (p = environ; ((c = *p)); ++p)
  34. {
  35. if (!strncmp(c, name, len) && (c[len] == '='))
  36. {
  37. *offset = p - environ;
  38. return(c + len + 1);
  39. }
  40. }
  41. return (NULL);
  42. }
  43. extern int
  44. setenv DECL3CC_(char *, name, char *, value, int, rewrite)
  45. {
  46. static int alloced = 0;
  47. char *c;
  48. int l_value, offset;
  49. if (*value == '=')
  50. value++;
  51. l_value = strlen(value);
  52. if ((c = findenv(name, &offset)))
  53. {
  54. if (!rewrite)
  55. return(0);
  56. if (strlen(c) >= l_value)
  57. {
  58. while ((*(c++) = *(value++)))
  59. /* NOTHING HERE */;
  60. return(0);
  61. }
  62. } else
  63. {
  64. int cnt;
  65. char **p;
  66. for (p = environ, cnt = 0; *p; p++, cnt++);
  67. if (alloced)
  68. {
  69. environ = (char **)realloc((char *)environ,
  70.     (size_t)(sizeof(char *) * (cnt + 2)));
  71. if (!environ)
  72. return(-1);
  73. } else
  74. {
  75. alloced = 1;
  76. p = (char **)malloc((size_t)(sizeof(char *) * (cnt+2)));
  77. if (!p)
  78. return(-1);
  79. bcopy((char *)environ, (char *)p, cnt * sizeof(char *));
  80. environ = p;
  81. }
  82. environ[cnt + 1] = NULL;
  83. offset = cnt;
  84. }
  85. for (c = (char *)name; *c && (*c != '='); c++)
  86. /* NOTHING HERE */;
  87. if (!(environ[offset] =
  88. (char *)malloc((size_t)((int)(c - name) + l_value+2))))
  89. return(-1);
  90. for (c = environ[offset]; ((*c = *(name++))) && (*c != '='); c++)
  91. /* NOTHING HERE */;
  92. for (*(c++) = '='; (*(c++) = *(value++)); )
  93. /* NOTHING HERE */;
  94. return (0);
  95. }
  96. extern VOID
  97. unsetenv DECL1C(char *, name)
  98. {
  99. char **p;
  100. int offset;
  101. while (findenv(name, &offset))
  102. {
  103. for (p = environ + offset; (*p = p[1]) ; p++)
  104. /* NOTHING HERE */;
  105. }
  106. }
  107. #else /* Not not HAVE_SETENV */
  108. extern int dummy;
  109. #endif /* HAVE_SETENV */