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; };