ref: 1d4b554015ba6bb9cce2902a648e4b5af2811df5
dir: /lib/std/env+plan9.myr/
use sys
use "alloc"
use "blat"
use "cstrconv"
use "die"
use "extremum"
use "fmt"
use "option"
use "result"
use "slcp"
use "sldup"
use "sleq"
use "slpush"
use "slurp"
use "threadhooks"
use "traits"
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.eq(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)
}