1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include<stdlib.h> #include<stdio.h> #include<string.h> #include<errno.h> extern char **environ; int __setenv(const char *, const char *, int overwrite);
int __unsetenv(const char *);
#define setenv(a,b,c) errno = 0; \ if(__setenv(a, b, c) == -1) { \ perror("setenv"); \ exit(1); \ }
#define unsetenv(a) errno = 0; \ if(__unsetenv(a) == -1) { \ perror("unsetenv"); \ exit(1); \ }
void printEnv();
int main(int argc, char **argv) { clearenv(); environ = (char **)malloc(argc*sizeof(char *)); for(int i = 1; i < argc; i++) { environ[i-1] = argv[i]; environ[i-1] = argv[i]; } environ[argc-1] = NULL; printEnv(); setenv("Jingtianer", "pretty", 1); setenv("Jingtianer", "handsome", 1); setenv("Meeow", "handsome", 0); setenv("Meeow", "pretty", 0); printEnv(); unsetenv("Meeow"); unsetenv("Jingtianer"); unsetenv("A"); printEnv(); return 0; }
void printEnv() { printf("environ=%p\n", environ); if(environ != NULL) for(char **env=environ; *env; env++) { printf("%s\n", *env); } }
int __setenv(const char *name, const char *val, int overwrite) { #ifndef GETENV size_t nameLen = strlen(name); char **env=environ; if(env) for(; *env; env++) { if(strncmp(name, *env, nameLen) == 0) { if(overwrite == 0) return 0; else break; } } char * envstr = (char *) malloc((nameLen+strlen(val)+1+1)*sizeof(char)); sprintf(envstr, "%s=%s", name, val); if(env != NULL && *env != NULL) { *env = envstr; } else { return putenv(envstr); } return 0; #endif
#ifdef GETENV char *env; if(env=getenv(name) != NULL && overwrite == 0) { return 0; } size_t nameLen = strlen(name); char * envstr = (char *) malloc((nameLen+strlen(val)+1+1)*sizeof(char)); sprintf(envstr, "%s=%s", name, val); return putenv(envstr); #endif
}
int __unsetenv(const char *name) { #ifndef GETENV if(environ == NULL) return 0; size_t nameLen = strlen(name); char **env=environ, **move = environ; for(; *env; env++) { if(strncmp(name, *env, nameLen) != 0) { *move = *env; move++; } } *move = NULL; return 0; #endif #ifdef GETENV char *env; if(env=getenv(name) != NULL) { return putenv(name); } #endif }
|