00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #if HAVE_CONFIG_H
00036 # include <config.h>
00037 #endif
00038
00039 #define setenv libiberty_setenv
00040 #define unsetenv libiberty_unsetenv
00041
00042 #include "ansidecl.h"
00043 #include <sys/types.h>
00044 #include <stdio.h>
00045
00046 #include <errno.h>
00047 #if !defined(errno) && !defined(HAVE_ERRNO_DECL)
00048 extern int errno;
00049 #endif
00050 #define __set_errno(ev) ((errno) = (ev))
00051
00052 #if HAVE_STDLIB_H
00053 # include <stdlib.h>
00054 #endif
00055 #if HAVE_STRING_H
00056 # include <string.h>
00057 #endif
00058 #if HAVE_UNISTD_H
00059 # include <unistd.h>
00060 #endif
00061
00062 #define __environ environ
00063 #ifndef HAVE_ENVIRON_DECL
00064 extern char **environ;
00065 #endif
00066
00067 #undef setenv
00068 #undef unsetenv
00069
00070
00071
00072 #define LOCK
00073 #define UNLOCK
00074
00075
00076
00077
00078
00079 static char **last_environ;
00080
00081
00082 int
00083 setenv (name, value, replace)
00084 const char *name;
00085 const char *value;
00086 int replace;
00087 {
00088 register char **ep = 0;
00089 register size_t size;
00090 const size_t namelen = strlen (name);
00091 const size_t vallen = strlen (value) + 1;
00092
00093 LOCK;
00094
00095 size = 0;
00096 if (__environ != NULL)
00097 {
00098 for (ep = __environ; *ep != NULL; ++ep)
00099 if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
00100 break;
00101 else
00102 ++size;
00103 }
00104
00105 if (__environ == NULL || *ep == NULL)
00106 {
00107 char **new_environ;
00108 if (__environ == last_environ && __environ != NULL)
00109
00110 new_environ = (char **) realloc (last_environ,
00111 (size + 2) * sizeof (char *));
00112 else
00113 new_environ = (char **) malloc ((size + 2) * sizeof (char *));
00114
00115 if (new_environ == NULL)
00116 {
00117 UNLOCK;
00118 return -1;
00119 }
00120
00121 new_environ[size] = malloc (namelen + 1 + vallen);
00122 if (new_environ[size] == NULL)
00123 {
00124 free ((char *) new_environ);
00125 __set_errno (ENOMEM);
00126 UNLOCK;
00127 return -1;
00128 }
00129
00130 if (__environ != last_environ)
00131 memcpy ((char *) new_environ, (char *) __environ,
00132 size * sizeof (char *));
00133
00134 memcpy (new_environ[size], name, namelen);
00135 new_environ[size][namelen] = '=';
00136 memcpy (&new_environ[size][namelen + 1], value, vallen);
00137
00138 new_environ[size + 1] = NULL;
00139
00140 last_environ = __environ = new_environ;
00141 }
00142 else if (replace)
00143 {
00144 size_t len = strlen (*ep);
00145 if (len + 1 < namelen + 1 + vallen)
00146 {
00147
00148 char *new = malloc (namelen + 1 + vallen);
00149 if (new == NULL)
00150 {
00151 UNLOCK;
00152 return -1;
00153 }
00154 *ep = new;
00155 }
00156 memcpy (*ep, name, namelen);
00157 (*ep)[namelen] = '=';
00158 memcpy (&(*ep)[namelen + 1], value, vallen);
00159 }
00160
00161 UNLOCK;
00162
00163 return 0;
00164 }
00165
00166 void
00167 unsetenv (name)
00168 const char *name;
00169 {
00170 const size_t len = strlen (name);
00171 char **ep;
00172
00173 LOCK;
00174
00175 for (ep = __environ; *ep; ++ep)
00176 if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
00177 {
00178
00179 char **dp = ep;
00180 do
00181 dp[0] = dp[1];
00182 while (*dp++);
00183
00184 }
00185
00186 UNLOCK;
00187 }