| #include <stdlib.h> |
| #include <string.h> |
| |
| extern char **__environ; |
| char **__env_map; |
| |
| int __putenv(char *s, int a) |
| { |
| int i=0, j=0; |
| char *z = strchr(s, '='); |
| char **newenv = 0; |
| char **newmap = 0; |
| static char **oldenv; |
| |
| if (!z) return unsetenv(s); |
| if (z==s) return -1; |
| for (; __environ[i] && memcmp(s, __environ[i], z-s+1); i++); |
| if (a) { |
| if (!__env_map) { |
| __env_map = calloc(2, sizeof(char *)); |
| if (__env_map) __env_map[0] = s; |
| } else { |
| for (; __env_map[j] && __env_map[j] != __environ[i]; j++); |
| if (!__env_map[j]) { |
| newmap = realloc(__env_map, sizeof(char *)*(j+2)); |
| if (newmap) { |
| __env_map = newmap; |
| __env_map[j] = s; |
| __env_map[j+1] = NULL; |
| } |
| } else { |
| free(__env_map[j]); |
| } |
| } |
| } |
| if (!__environ[i]) { |
| newenv = malloc(sizeof(char *)*(i+2)); |
| if (!newenv) { |
| if (a && __env_map) __env_map[j] = 0; |
| return -1; |
| } |
| memcpy(newenv, __environ, sizeof(char *)*i); |
| newenv[i] = s; |
| newenv[i+1] = 0; |
| __environ = newenv; |
| free(oldenv); |
| oldenv = __environ; |
| } |
| |
| __environ[i] = s; |
| return 0; |
| } |
| |
| int putenv(char *s) |
| { |
| return __putenv(s, 0); |
| } |