1#include <stdlib.h> 2#include <string.h> 3 4extern char **__environ; 5char **__env_map; 6 7int __putenv(char *s, int a) 8{ 9 int i=0, j=0; 10 char *z = strchr(s, '='); 11 char **newenv = 0; 12 char **newmap = 0; 13 static char **oldenv; 14 15 if (!z) return unsetenv(s); 16 if (z==s) return -1; 17 for (; __environ[i] && memcmp(s, __environ[i], z-s+1); i++); 18 if (a) { 19 if (!__env_map) { 20 __env_map = calloc(2, sizeof(char *)); 21 if (__env_map) __env_map[0] = s; 22 } else { 23 for (; __env_map[j] && __env_map[j] != __environ[i]; j++); 24 if (!__env_map[j]) { 25 newmap = realloc(__env_map, sizeof(char *)*(j+2)); 26 if (newmap) { 27 __env_map = newmap; 28 __env_map[j] = s; 29 __env_map[j+1] = NULL; 30 } 31 } else { 32 free(__env_map[j]); 33 __env_map[j] = s; 34 } 35 } 36 } 37 if (!__environ[i]) { 38 newenv = malloc(sizeof(char *)*(i+2)); 39 if (!newenv) { 40 if (a && __env_map) __env_map[j] = 0; 41 return -1; 42 } 43 memcpy(newenv, __environ, sizeof(char *)*i); 44 newenv[i] = s; 45 newenv[i+1] = 0; 46 __environ = newenv; 47 free(oldenv); 48 oldenv = __environ; 49 } 50 51 __environ[i] = s; 52 return 0; 53} 54 55int putenv(char *s) 56{ 57 return __putenv(s, 0); 58} 59