void readenv(void) { char *p; int envf, f; Dir *e; char nam[1024]; int i, n, len; Word *w; rfork(RFENVG); /* use copy of the current environment variables */ envf = open("/env", OREAD); if(envf < 0) return; while((n = dirread(envf, &e)) > 0){ for(i = 0; i < n; i++){ len = e[i].length; /* don't import funny names, NULL values, * or internal mk variables */ if(len <= 0 || *shname(e[i].name) != '\0') continue; if (symlook(e[i].name, S_INTERNAL, 0)) continue; snprint(nam, sizeof nam, "/env/%s", e[i].name); f = open(nam, OREAD); if(f < 0) continue; p = Malloc(len+1); if(read(f, p, len) != len){ perror(nam); close(f); continue; } close(f); if (p[len-1] == 0) len--; else p[len] = 0; w = encodenulls(p, len); free(p); p = strdup(e[i].name); setvar(p, (void *) w); symlook(p, S_EXPORTED, (void*)"")->u.ptr = ""; } free(e); } close(envf); }
void readenv(void) { char **p, *s; Word *w; for(p = environ; *p; p++) { s = shname(*p); if(*s == '=') { *s = 0; w = newword(s+1); } else w = newword(""); if (symlook(*p, S_INTERNAL, 0)) continue; s = strdup9(*p); setvar(s, (void *)w); symlook(s, S_EXPORTED, (void *)"")->value = ""; } }