#include #include #include #include #include #include extern char **environ; /* * we need to put the environment into * the extern char **environ variable rather than #e/name so that * getenv can find it and execve doesn't overwrite it. * * this is horribly non-thread-safe. */ int putenv(char *s) { int f, n, l, cnt; char *value; char **p, *q; char buf[300]; // fprintf(stderr, "putenv %s\n", s); value = strchr(s, '='); if(!value) return -1; l = value+1-s; for(p=environ, cnt=0; *p; p++, cnt++) { if(strncmp(*p, s, l) == 0) break; } /* already same value? */ if(*p && strcmp(*p, s) == 0) return 0; /* allocate new string before messing with environ */ q = strdup(s); if(q == 0) return -1; if(*p == 0) { /* did not find: make room; what a kludge */ p = realloc(environ, (cnt+2)*sizeof(*p)); if(p == 0) return -1; environ = p; p[cnt+1] = 0; p = environ+cnt; } *p = q; return 0; }