ref: d3da2e1b89f30f404c3d11053680098f1b7bf677
dir: /appl/lib/env.b/
implement Env; # # Copyright © 2000 Vita Nuova Limited. All rights reserved. # include "sys.m"; sys: Sys; include "draw.m"; include "bufio.m"; include "readdir.m"; include "env.m"; ENVDIR : con "/env/"; setenv(var: string, val: string): int { init(); if (var == nil || !nameok(var)) { sys->werrstr("bad variable name"); return -1; } if (val == nil) { sys->remove(ENVDIR+var); return 0; } fd := sys->create(ENVDIR+var, Sys->OWRITE, 8r600); if (fd == nil) return -1; valb := array of byte val; if (sys->write(fd, valb, len valb) != len valb) return -1; return 0; } getenv(var: string): string { init(); if (var == nil || !nameok(var)) return nil; fd := sys->open(ENVDIR+var, Sys->OREAD); if (fd == nil) return nil; (ok, stat) := sys->fstat(fd); if (ok == -1) return nil; buf := array[int stat.length] of byte; n := sys->read(fd, buf, len buf); if (n < 0) return nil; return string buf[0:n]; } getall(): list of (string, string) { readdir := load Readdir Readdir->PATH; if (readdir == nil) return nil; (a, nil) := readdir->init(ENVDIR, Readdir->NONE | Readdir->COMPACT | Readdir->DESCENDING); vl: list of (string, string); for (i := 0; i < len a; i++) vl = (a[i].name, getenv(a[i].name)) :: vl; return vl; } # clone the current environment clone(): int { init(); return sys->pctl(sys->FORKENV, nil); } new(): int { init(); return sys->pctl(sys->NEWENV, nil); } init() { if (sys == nil) sys = load Sys Sys->PATH; } nameok(var: string): int { for(i:=0; i<len var; i++) if (var[i] == '/') return 0; return 1; }