ref: 7ef09f3db883c42d01e3b1d80f0d2da6ceff9913
dir: /lib/std/env+plan9.myr/
use sys use "alloc" use "cstrconv" use "die" use "extremum" use "fmt" use "option" use "result" use "slcp" use "sldup" use "sleq" use "slpush" use "slurp" use "blat" use "threadhooks" pkg std = const getenv : (name : byte[:] -> option(byte[:])) const getenvv : (name : byte[:], default : byte[:] -> byte[:]) const setenv : (name : byte[:], val : byte[:] -> void) ;; var envkey : byte[:][:] var envval : byte[:][:] const envfind = {key lock(envlck) for var i = 0; i < envkey.len; i++ if std.sleq(envkey[i], key) unlock(envlck) -> `Some envval[i] ;; ;; unlock(envlck) -> `None } const getenv = {name var s, ret match envfind(name) | `Some val: ret = `Some val | `None: s = fmt("/env/{}", name) match std.slurp(s) | `Err m: ret = `None | `Ok data: data = cstrconv(data) lock(envlck) slpush(&envkey, sldup(data)) slpush(&envval, data) unlock(envlck) ret = `Some data ;; std.slfree(s) ;; -> ret } const getenvv = {name, default match getenv(name) | `Some val: -> val | `None: -> default ;; } const setenv = {name, val var p p = fmt("/env/{}", name) blat(p, val, 0o644) slfree(p) }