| #include "../git-compat-util.h" | |
| int gitsetenv(const char *name, const char *value, int replace) | |
| { | |
| int out; | |
| size_t namelen, valuelen; | |
| char *envstr; | |
| if (!name || strchr(name, '=') || !value) { | |
| errno = EINVAL; | |
| return -1; | |
| } | |
| if (!replace) { | |
| char *oldval = NULL; | |
| oldval = getenv(name); | |
| if (oldval) return 0; | |
| } | |
| namelen = strlen(name); | |
| valuelen = strlen(value); | |
| envstr = malloc(st_add3(namelen, valuelen, 2)); | |
| if (!envstr) { | |
| errno = ENOMEM; | |
| 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; | |
| } |