#include #include #include #include #include extern char **environ; static int envredo(char *s) { char *x, **p, *q, **v, *mem; int n, nsz, nenv, esz; x = strchr(s, '='); if(x == NULL) return -1; nsz = x - s + 1; /* compare the var=, not just var */ nenv = 1; esz = strlen(s)+1; for(p = environ; (q = *p) != NULL; p++){ esz += strlen(q)+1; nenv++; } /* overestimate in the case we have changed a variable. */ v = malloc((nenv+1)*sizeof(char**) + esz); if(v == NULL) return -1; mem = (char*)(v + nenv + 1); nenv = 0; for(p = environ; (q = *p) != NULL; p++){ if(strncmp(q, s, nsz) == 0) continue; v[nenv++] = mem; n = strlen(q)+1; memcpy(mem, q, n); mem += n; } v[nenv++] = mem; n = strlen(s)+1; memcpy(mem, s, n); v[nenv] = NULL; free(environ); environ = v; return 0; } int putenv(char *s) { int f, n; char *value; char buf[300]; value = strchr(s, '='); if (value) { n = value-s; if(n<=0 || n > sizeof(buf)-6) return -1; strcpy(buf, "/env/"); strncpy(buf+5, s, n); buf[n+5] = 0; f = creat(buf, 0666); if(f < 0) return 1; value++; n = strlen(value); if(write(f, value, n) != n) return -1; close(f); return envredo(s); } else return -1; }