ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /module/factotum.m/
Factotum: module
{
PATH: con "/dis/lib/factotum.dis";
# client interface to Plan 9 or Inferno factotum
Authinfo: adt {
cuid: string; # caller id
suid: string; # server id
cap: string; # capability (only valid on server side)
secret: array of byte;
# TO DO: add attrs
unpack: fn(a: array of byte): (int, ref Authinfo);
read: fn(fd: ref Sys->FD): ref Authinfo;
};
mount: fn(fd: ref Sys->FD, mnt: string, flags: int, aname: string, keyspec: string): (int, ref Authinfo);
# factotum interaction
AuthRpcMax: con 4096;
init: fn();
open: fn(): ref Sys->FD;
rpc: fn(fd: ref Sys->FD, verb: string, a: array of byte): (string, array of byte);
proxy: fn(afd: ref Sys->FD, facfd: ref Sys->FD, arg: string): ref Authinfo;
genproxy: fn(
readc: chan of (array of byte, chan of (int, string)),
writec: chan of (array of byte, chan of (int, string)),
donec: chan of (ref Authinfo, string),
afd: ref Sys->FD,
params: string);
rpcattrs: fn(afd: ref Sys->FD): list of ref Attr;
getuserpasswd: fn(keyspec: string): (string, string);
# challenge/response
Challenge: adt {
user: string;
chal: string;
afd: ref Sys->FD;
};
challenge: fn(keyspec: string): ref Challenge;
response: fn(c: ref Challenge, resp: string): ref Authinfo;
respond: fn(chal: string, keyspec: string): (string, string);
dump: fn(a: array of byte): string;
setdebug: fn(i: int);
Aattr, Aval, Aquery: con iota;
Attr: adt {
tag: int;
name: string;
val: string;
text: fn(a: self ref Attr): string;
};
parseattrs: fn(s: string): list of ref Attr;
copyattrs: fn(l: list of ref Attr): list of ref Attr;
delattr: fn(l: list of ref Attr, n: string): list of ref Attr;
takeattrs: fn(l: list of ref Attr, names: list of string): list of ref Attr;
findattr: fn(l: list of ref Attr, n: string): ref Attr;
findattrval: fn(l: list of ref Attr, n: string): string;
publicattrs: fn(l: list of ref Attr): list of ref Attr;
attrtext: fn(l: list of ref Attr): string;
};