ref: 80e1f20064f435fba7b4c7be70fd6b19c5218cc3
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) }