aboutsummaryrefslogtreecommitdiff
path: root/win32/env.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-14 02:15:27 +0200
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-09-10 18:50:00 +1000
commit43992d86844f4fa77b6e6613ce62b96d0e115bd5 (patch)
treeb796950986f05c73256f0bace01204dec8d1e0e8 /win32/env.c
parent22c4fb20d407f464813ce1031308bc4c6db13bb4 (diff)
downloadbusybox-w32-43992d86844f4fa77b6e6613ce62b96d0e115bd5.tar.gz
busybox-w32-43992d86844f4fa77b6e6613ce62b96d0e115bd5.tar.bz2
busybox-w32-43992d86844f4fa77b6e6613ce62b96d0e115bd5.zip
win32: add getenv(), setenv(), unsetenv() and clearenv()
clearenv() is not supported yet.
Diffstat (limited to 'win32/env.c')
-rw-r--r--win32/env.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/win32/env.c b/win32/env.c
new file mode 100644
index 000000000..376ad9d47
--- /dev/null
+++ b/win32/env.c
@@ -0,0 +1,119 @@
1#include "libbb.h"
2
3char **copy_environ(const char *const *envp)
4{
5 char **env;
6 int i = 0;
7 while (envp[i])
8 i++;
9 env = xmalloc((i+1)*sizeof(*env));
10 for (i = 0; envp[i]; i++)
11 env[i] = xstrdup(envp[i]);
12 env[i] = NULL;
13 return env;
14}
15
16void free_environ(char **env)
17{
18 int i;
19 for (i = 0; env[i]; i++)
20 free(env[i]);
21 free(env);
22}
23
24static int lookup_env(char **env, const char *name, size_t nmln)
25{
26 int i;
27
28 for (i = 0; env[i]; i++) {
29 if (0 == strncmp(env[i], name, nmln)
30 && '=' == env[i][nmln])
31 /* matches */
32 return i;
33 }
34 return -1;
35}
36
37#undef getenv
38char *mingw_getenv(const char *name)
39{
40 char *result = getenv(name);
41 if (!result && !strcmp(name, "TMPDIR")) {
42 /* on Windows it is TMP and TEMP */
43 result = getenv("TMP");
44 if (!result)
45 result = getenv("TEMP");
46 }
47 return result;
48}
49
50int setenv(const char *name, const char *value, int replace)
51{
52 int out;
53 size_t namelen, valuelen;
54 char *envstr;
55
56 if (!name || !value) return -1;
57 if (!replace) {
58 char *oldval = NULL;
59 oldval = getenv(name);
60 if (oldval) return 0;
61 }
62
63 namelen = strlen(name);
64 valuelen = strlen(value);
65 envstr = malloc((namelen + valuelen + 2));
66 if (!envstr) return -1;
67
68 memcpy(envstr, name, namelen);
69 envstr[namelen] = '=';
70 memcpy(envstr + namelen + 1, value, valuelen);
71 envstr[namelen + valuelen + 1] = 0;
72
73 out = putenv(envstr);
74 /* putenv(3) makes the argument string part of the environment,
75 * and changing that string modifies the environment --- which
76 * means we do not own that storage anymore. Do not free
77 * envstr.
78 */
79
80 return out;
81}
82
83/*
84 * If name contains '=', then sets the variable, otherwise it unsets it
85 */
86char **env_setenv(char **env, const char *name)
87{
88 char *eq = strchrnul(name, '=');
89 int i = lookup_env(env, name, eq-name);
90
91 if (i < 0) {
92 if (*eq) {
93 for (i = 0; env[i]; i++)
94 ;
95 env = xrealloc(env, (i+2)*sizeof(*env));
96 env[i] = xstrdup(name);
97 env[i+1] = NULL;
98 }
99 }
100 else {
101 free(env[i]);
102 if (*eq)
103 env[i] = xstrdup(name);
104 else
105 for (; env[i]; i++)
106 env[i] = env[i+1];
107 }
108 return env;
109}
110
111void unsetenv(const char *env)
112{
113 env_setenv(environ, env);
114}
115
116int clearenv(void)
117{
118 bb_error_msg_and_die("clearenv() is not supported");
119}