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