diff options
Diffstat (limited to 'libbb/setenv.c')
-rw-r--r-- | libbb/setenv.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libbb/setenv.c b/libbb/setenv.c new file mode 100644 index 000000000..3a22ea7b7 --- /dev/null +++ b/libbb/setenv.c | |||
@@ -0,0 +1,34 @@ | |||
1 | #include "../git-compat-util.h" | ||
2 | |||
3 | int gitsetenv(const char *name, const char *value, int replace) | ||
4 | { | ||
5 | int out; | ||
6 | size_t namelen, valuelen; | ||
7 | char *envstr; | ||
8 | |||
9 | if (!name || !value) return -1; | ||
10 | if (!replace) { | ||
11 | char *oldval = NULL; | ||
12 | oldval = getenv(name); | ||
13 | if (oldval) return 0; | ||
14 | } | ||
15 | |||
16 | namelen = strlen(name); | ||
17 | valuelen = strlen(value); | ||
18 | envstr = malloc((namelen + valuelen + 2)); | ||
19 | if (!envstr) return -1; | ||
20 | |||
21 | memcpy(envstr, name, namelen); | ||
22 | envstr[namelen] = '='; | ||
23 | memcpy(envstr + namelen + 1, value, valuelen); | ||
24 | envstr[namelen + valuelen + 1] = 0; | ||
25 | |||
26 | out = putenv(envstr); | ||
27 | /* putenv(3) makes the argument string part of the environment, | ||
28 | * and changing that string modifies the environment --- which | ||
29 | * means we do not own that storage anymore. Do not free | ||
30 | * envstr. | ||
31 | */ | ||
32 | |||
33 | return out; | ||
34 | } | ||