12 #ifdef MISSING_SETENV_PUTENV
18 extern char **environ;
20 static int addenv(
char *);
21 static int allocated = 0;
27 static ssize_t namelength(
const char *name)
31 equal = strchr(name,
'=');
32 return ((equal == 0) ? strlen(name) : (equal - name));
37 static char **findenv(
const char *name, ssize_t len)
41 for (envp = environ; envp && *envp; envp++)
42 if (strncmp(name, *envp, len) == 0 && (*envp)[len] ==
'=')
51 char *getenv(
const char *name)
53 ssize_t len = namelength(name);
54 char **envp = findenv(name, len);
56 return (envp ? *envp + len + 1 : 0);
61 int putenv(
const char *nameval)
63 char *equal = strchr(nameval,
'=');
64 char *value = (equal ? equal :
"");
66 return (setenv(nameval, value, DO_CLOBBER));
71 void unsetenv(
const char *name)
75 while ((envp = findenv(name, namelength(name))) != 0)
76 while (envp[0] = envp[1])
84 int setenv(
const char *name,
const char *value,
int clobber)
89 unsigned int l_nameval;
93 l_name = namelength(name);
94 envp = findenv(name, l_name);
95 if (envp != 0 && clobber == 0)
99 l_nameval = l_name + strlen(value) + 1;
106 destination = (envp != 0 && strlen(*envp) >= l_nameval) ?
107 *envp : malloc(l_nameval + 1);
108 if (destination == 0)
110 strncpy(destination, name, l_name);
111 destination[l_name] =
'=';
112 strcpy(destination + l_name + 1, value);
113 return ((envp == 0) ? addenv(destination) : (*envp = destination, 0));
118 static char *cmalloc(ssize_t new_len,
char *old, ssize_t old_len)
120 char *
new = malloc(new_len);
123 memcpy(
new, old, old_len);
129 static int addenv(
char *nameval)
136 for (envp = environ; envp && *envp; envp++)
138 n_used = envp - environ;
139 l_used = n_used *
sizeof(*envp);
140 l_need = l_used + 2 *
sizeof(*envp);
143 (
char **) realloc((
char *) environ, l_need) :
144 (
char **) cmalloc(l_need, (
char *) environ, l_used);
150 environ[n_used++] = nameval;