git
1#include "../git-compat-util.h"2
3int gitsetenv(const char *name, const char *value, int replace)4{
5int out;6size_t namelen, valuelen;7char *envstr;8
9if (!name || strchr(name, '=') || !value) {10errno = EINVAL;11return -1;12}13if (!replace) {14char *oldval = NULL;15oldval = getenv(name);16if (oldval) return 0;17}18
19namelen = strlen(name);20valuelen = strlen(value);21envstr = malloc(st_add3(namelen, valuelen, 2));22if (!envstr) {23errno = ENOMEM;24return -1;25}26
27memcpy(envstr, name, namelen);28envstr[namelen] = '=';29memcpy(envstr + namelen + 1, value, valuelen);30envstr[namelen + valuelen + 1] = 0;31
32out = putenv(envstr);33/* putenv(3) makes the argument string part of the environment,34* and changing that string modifies the environment --- which
35* means we do not own that storage anymore. Do not free
36* envstr.
37*/
38
39return out;40}
41