1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include "libbb.h"
char **copy_environ(const char *const *envp)
{
char **env;
int i = 0;
while (envp[i])
i++;
env = xmalloc((i+1)*sizeof(*env));
for (i = 0; envp[i]; i++)
env[i] = xstrdup(envp[i]);
env[i] = NULL;
return env;
}
void free_environ(char **env)
{
int i;
for (i = 0; env[i]; i++)
free(env[i]);
free(env);
}
static int lookup_env(char **env, const char *name, size_t nmln)
{
int i;
for (i = 0; env[i]; i++) {
if (0 == strncmp(env[i], name, nmln)
&& '=' == env[i][nmln])
/* matches */
return i;
}
return -1;
}
#undef getenv
char *mingw_getenv(const char *name)
{
char *result = getenv(name);
if (!result && !strcmp(name, "TMPDIR")) {
/* on Windows it is TMP and TEMP */
result = getenv("TMP");
if (!result)
result = getenv("TEMP");
}
return result;
}
int setenv(const char *name, const char *value, int replace)
{
int out;
size_t namelen, valuelen;
char *envstr;
if (!name || !value) return -1;
if (!replace) {
char *oldval = NULL;
oldval = getenv(name);
if (oldval) return 0;
}
namelen = strlen(name);
valuelen = strlen(value);
envstr = malloc((namelen + valuelen + 2));
if (!envstr) return -1;
memcpy(envstr, name, namelen);
envstr[namelen] = '=';
memcpy(envstr + namelen + 1, value, valuelen);
envstr[namelen + valuelen + 1] = 0;
out = putenv(envstr);
/* putenv(3) makes the argument string part of the environment,
* and changing that string modifies the environment --- which
* means we do not own that storage anymore. Do not free
* envstr.
*/
return out;
}
/*
* If name contains '=', then sets the variable, otherwise it unsets it
*/
char **env_setenv(char **env, const char *name)
{
char *eq = strchrnul(name, '=');
int i = lookup_env(env, name, eq-name);
if (i < 0) {
if (*eq) {
for (i = 0; env[i]; i++)
;
env = xrealloc(env, (i+2)*sizeof(*env));
env[i] = xstrdup(name);
env[i+1] = NULL;
}
}
else {
free(env[i]);
if (*eq)
env[i] = xstrdup(name);
else
for (; env[i]; i++)
env[i] = env[i+1];
}
return env;
}
void unsetenv(const char *env)
{
env_setenv(environ, env);
}
int clearenv(void)
{
char **env = environ;
if (!env)
return 0;
while (*env) {
free(*env);
env++;
}
free(env);
environ = NULL;
return 0;
}
|