ref: a54d7deb4b5cdc397f1e5cf3957edc0b91f5f880
dir: /lib/std/syswrap-ss+plan9.myr/
use sys use "types" use "errno" use "cstrconv" use "strfind" pkg std = const nanosleep : (nsecs : uint64 -> errno) $noret const exit : (status : int -> void) pkglocal const bgetcwd : (buf : byte[:] -> errno) pkglocal const lasterr : (-> errno) ;; const nanosleep = {nsecs if sys.sleep((nsecs/1_000_000 : uint32)) < 0 -> lasterr() ;; -> 0 } const bgetcwd = {buf var fd fd = sys.open(".", sys.Ordonly) if fd < 0 -> (fd : errno) ;; if sys.fd2path(fd, buf) == 0 /* Because we don't return the size, the best we can do is assume that if the buffer is completely full, we have truncated it. Since we truncate at utf8 characters, we can have at most 3 bytes truncated (4 bytes will fit any utf8 char), and one byte for the nul terminator. */ if cstrlen(buf) + 5 == buf.len -> Erange else -> (cstrlen(buf) : errno) ;; ;; -> Emisc } const digitchars = "0123456789" const exit = {status var buf : byte[32] /* big enough for exit status numbers */ var n, i if status == 0 sys.exits("") else status &= 255 i = 100 n = 0 while i > 0 if status >= i buf[n++] = digitchars[(status/i)%10] ;; i /= 10 ;; sys.exits(buf[:n]) ;; } const lasterr = { var errbuf : byte[sys.Maxerr] var err sys.errstr(errbuf[:]) err = cstrconv(errbuf[:]) if strhas(err, "no error") -> Enone elif strhas(err, "already exists") -> Eexist elif strhas(err, "read or write too large") -> Erange elif strhas(err, "read or write too small") -> Erange elif strhas(err, "i/o error") -> Eio elif strhas(err, "fd out of range or not open") -> Ebadf else -> Emisc ;; }