#include <stdlib.h> | |
#include <string.h> | |
int gitsetenv(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; | |
} |