ref: 00e81c21f68c73403e42d08a6d5d955aa303cefd
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)
}