137da2899SCharles.Forsythimplement Env; 237da2899SCharles.Forsyth 337da2899SCharles.Forsyth# 437da2899SCharles.Forsyth# Copyright © 2000 Vita Nuova Limited. All rights reserved. 537da2899SCharles.Forsyth# 637da2899SCharles.Forsyth 737da2899SCharles.Forsythinclude "sys.m"; 837da2899SCharles.Forsyth sys: Sys; 937da2899SCharles.Forsythinclude "draw.m"; 1037da2899SCharles.Forsythinclude "bufio.m"; 1137da2899SCharles.Forsythinclude "readdir.m"; 1237da2899SCharles.Forsythinclude "env.m"; 1337da2899SCharles.Forsyth 1437da2899SCharles.ForsythENVDIR : con "/env/"; 1537da2899SCharles.Forsyth 1637da2899SCharles.Forsythsetenv(var: string, val: string): int 1737da2899SCharles.Forsyth{ 1837da2899SCharles.Forsyth init(); 1937da2899SCharles.Forsyth if (var == nil || !nameok(var)) { 2037da2899SCharles.Forsyth sys->werrstr("bad variable name"); 2137da2899SCharles.Forsyth return -1; 2237da2899SCharles.Forsyth } 2337da2899SCharles.Forsyth if (val == nil) { 2437da2899SCharles.Forsyth sys->remove(ENVDIR+var); 2537da2899SCharles.Forsyth return 0; 2637da2899SCharles.Forsyth } 2737da2899SCharles.Forsyth fd := sys->create(ENVDIR+var, Sys->OWRITE, 8r600); 2837da2899SCharles.Forsyth if (fd == nil) 2937da2899SCharles.Forsyth return -1; 3037da2899SCharles.Forsyth valb := array of byte val; 3137da2899SCharles.Forsyth if (sys->write(fd, valb, len valb) != len valb) 3237da2899SCharles.Forsyth return -1; 3337da2899SCharles.Forsyth return 0; 3437da2899SCharles.Forsyth} 3537da2899SCharles.Forsyth 3637da2899SCharles.Forsythgetenv(var: string): string 3737da2899SCharles.Forsyth{ 3837da2899SCharles.Forsyth init(); 3937da2899SCharles.Forsyth if (var == nil || !nameok(var)) 4037da2899SCharles.Forsyth return nil; 4137da2899SCharles.Forsyth fd := sys->open(ENVDIR+var, Sys->OREAD); 4237da2899SCharles.Forsyth if (fd == nil) 4337da2899SCharles.Forsyth return nil; 4437da2899SCharles.Forsyth (ok, stat) := sys->fstat(fd); 4537da2899SCharles.Forsyth if (ok == -1) 4637da2899SCharles.Forsyth return nil; 4737da2899SCharles.Forsyth buf := array[int stat.length] of byte; 4837da2899SCharles.Forsyth n := sys->read(fd, buf, len buf); 4937da2899SCharles.Forsyth if (n < 0) 5037da2899SCharles.Forsyth return nil; 5137da2899SCharles.Forsyth return string buf[0:n]; 5237da2899SCharles.Forsyth} 5337da2899SCharles.Forsyth 5437da2899SCharles.Forsythgetall(): list of (string, string) 5537da2899SCharles.Forsyth{ 5637da2899SCharles.Forsyth readdir := load Readdir Readdir->PATH; 5737da2899SCharles.Forsyth if (readdir == nil) 5837da2899SCharles.Forsyth return nil; 59*9b29ac7eSCharles.Forsyth (a, nil) := readdir->init(ENVDIR, 6037da2899SCharles.Forsyth Readdir->NONE | Readdir->COMPACT | Readdir->DESCENDING); 6137da2899SCharles.Forsyth vl: list of (string, string); 6237da2899SCharles.Forsyth for (i := 0; i < len a; i++) 6337da2899SCharles.Forsyth vl = (a[i].name, getenv(a[i].name)) :: vl; 6437da2899SCharles.Forsyth return vl; 6537da2899SCharles.Forsyth} 6637da2899SCharles.Forsyth 6737da2899SCharles.Forsyth# clone the current environment 6837da2899SCharles.Forsythclone(): int 6937da2899SCharles.Forsyth{ 7037da2899SCharles.Forsyth init(); 7137da2899SCharles.Forsyth return sys->pctl(sys->FORKENV, nil); 7237da2899SCharles.Forsyth} 7337da2899SCharles.Forsyth 7437da2899SCharles.Forsythnew(): int 7537da2899SCharles.Forsyth{ 7637da2899SCharles.Forsyth init(); 7737da2899SCharles.Forsyth return sys->pctl(sys->NEWENV, nil); 7837da2899SCharles.Forsyth} 7937da2899SCharles.Forsyth 8037da2899SCharles.Forsythinit() 8137da2899SCharles.Forsyth{ 8237da2899SCharles.Forsyth if (sys == nil) 8337da2899SCharles.Forsyth sys = load Sys Sys->PATH; 8437da2899SCharles.Forsyth} 8537da2899SCharles.Forsyth 8637da2899SCharles.Forsythnameok(var: string): int 8737da2899SCharles.Forsyth{ 8837da2899SCharles.Forsyth for(i:=0; i<len var; i++) 8937da2899SCharles.Forsyth if (var[i] == '/') return 0; 9037da2899SCharles.Forsyth return 1; 9137da2899SCharles.Forsyth} 92