 6ac1b2a3b8
			
		
	
	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;
 | |
| }
 |