#include #include extern char *_envp; #define ENVSIZ (1<<12) /* 4K environment string */ static int envset = FALSE; /* local env created? */ int putenv(entry) char *entry; /* * Add to the environment. can be any of the following * forms: * remove * = set to a null value * = set to */ { register char *p, *q, *t, c; register int len; char *malloc(), *getenv(); if(!envset) /* no local env */ { if((p = malloc(ENVSIZ)) == NULL) return(FALSE); q = _envp; _envp = p; envset = TRUE; if(q) { while(*q) while(*p++ = *q++) ; } else *p++ = '\0'; *p++ = '\0'; *p = 0xFF; } for(t=entry; (c = *t) && (c != '='); ++t) ; *t = '\0'; if(p = getenv(entry)) /* remove old var */ { q = p; while(*q++) /* find end of old val */ ; p -= (len = strlen(entry)); while(strncmp(--p, entry, len)) /* find start of old var */ ; while(*q) /* copy environment tail */ while(*p++ = *q++) ; *p++ = '\0'; /* tie off environment */ *p = 0xFF; } if(c == '=') /* install new var */ { p = _envp; while(*p) /* find end of env */ while(*p++) ; *t = c; q = entry; while(*p++ = *q++) /* copy new entry */ ; *p++ = '\0'; /* tie off environment */ *p = 0xFF; } _base->p_env = _envp; /* update basepage pointer */ return(TRUE); }