6ac1b2a3b8
According to POSIX, setenv should error out with EINVAL if it's asked to set an environment variable whose name contains an equals sign. Implement this detail in our compatibility-fallback. Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
41 lines
857 B
C
41 lines
857 B
C
#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((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;
|
|
}
|