|  | #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; | 
|  | } |