1Styxservers: module 2{ 3 PATH: con "/dis/lib/styxservers.dis"; 4 5 Fid: adt { 6 fid: int; # client's fid 7 path: big; # file's 64-bit unique path 8 qtype: int; # file's qid type (eg, Sys->QTDIR if directory) 9 isopen: int; # non-zero if file is open 10 mode: int; # if open, the open mode 11 doffset: (int, int); # (internal) cache of directory offset 12 uname: string; # user name from original attach 13 param: string; # attach aname from original attach 14 data: array of byte; # application data 15 16 clone: fn(f: self ref Fid, nf: ref Fid): ref Fid; 17 open: fn(f: self ref Fid, mode: int, qid: Sys->Qid); 18 walk: fn(f: self ref Fid, qid: Sys->Qid); 19 }; 20 21 Navigator: adt { 22 c: chan of ref Navop; 23 reply: chan of (ref Sys->Dir, string); 24 25 new: fn(c: chan of ref Navop): ref Navigator; 26 stat: fn(t: self ref Navigator, q: big): (ref Sys->Dir, string); 27 walk: fn(t: self ref Navigator, parentq: big, name: string): (ref Sys->Dir, string); 28 readdir: fn(t: self ref Navigator, q: big, offset, count: int): array of ref Sys->Dir; 29 }; 30 31 Navop: adt { 32 reply: chan of (ref Sys->Dir, string); # channel for reply 33 path: big; # file or directory path 34 pick { 35 Stat => 36 Walk => 37 name: string; 38 Readdir => 39 offset: int; # index (origin 0) of first directory entry to return 40 count: int; # number of directory entries requested 41 } 42 }; 43 44 Styxserver: adt { 45 fd: ref Sys->FD; # file server end of connection 46 fids: array of list of ref Fid; # hash table of fids 47 fidlock: chan of int; 48 t: ref Navigator; # name space navigator for this server 49 rootpath: big; # Qid.path of root of its name space 50 msize: int; # negotiated Styx message size 51 replychan: chan of ref Styx->Rmsg; 52 53 new: fn(fd: ref Sys->FD, t: ref Navigator, rootpath: big): (chan of ref Styx->Tmsg, ref Styxserver); 54 reply: fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int; 55 replydirect: fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int; 56 error: fn(srv: self ref Styxserver, m: ref Styx->Tmsg, msg: string); 57 58 # protocol operations 59 attach: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Attach): ref Fid; 60 clunk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Clunk): ref Fid; 61 walk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Walk): ref Fid; 62 open: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): ref Fid; 63 read: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): ref Fid; 64 remove: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): ref Fid; 65 stat: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Stat); 66 67 default: fn(srv: self ref Styxserver, gm: ref Styx->Tmsg); 68 69 # check validity but don't reply 70 cancreate: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Create): (ref Fid, int, ref Sys->Dir, string); 71 canopen: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): (ref Fid, int, ref Sys->Dir, string); 72 canremove: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): (ref Fid, big, string); 73 canread: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): (ref Fid, string); 74 canwrite: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Write): (ref Fid, string); 75 76 # fid management 77 getfid: fn(srv: self ref Styxserver, fid: int): ref Fid; 78 newfid: fn(srv: self ref Styxserver, fid: int): ref Fid; 79 delfid: fn(srv: self ref Styxserver, c: ref Fid); 80 allfids: fn(srv: self ref Styxserver): list of ref Fid; 81 82 iounit: fn(srv: self ref Styxserver): int; 83 }; 84 85 init: fn(styx: Styx); 86 traceset: fn(on: int); 87 88 readbytes: fn(m: ref Styx->Tmsg.Read, d: array of byte): ref Styx->Rmsg.Read; 89 readstr: fn(m: ref Styx->Tmsg.Read, s: string): ref Styx->Rmsg.Read; 90 91 openok: fn(uname: string, omode, perm: int, fuid, fgid: string): int; 92 openmode: fn(o: int): int; 93 94 Einuse: con "fid already in use"; 95 Ebadfid: con "bad fid"; 96 Eopen: con "fid already opened"; 97 Enotfound: con "file does not exist"; 98 Enotdir: con "not a directory"; 99 Eperm: con "permission denied"; 100 Ebadarg: con "bad argument"; 101 Eexists: con "file already exists"; 102 Emode: con "open/create -- unknown mode"; 103 Eoffset: con "read/write -- bad offset"; 104 Ecount: con "read/write -- count negative or exceeds msgsize"; 105 Enotopen: con "read/write -- on non open fid"; 106 Eaccess: con "read/write -- not open in suitable mode"; 107 Ename: con "bad character in file name"; 108 Edot: con ". and .. are illegal names"; 109}; 110 111Nametree: module { 112 PATH: con "/dis/lib/nametree.dis"; 113 Tree: adt { 114 c: chan of ref Treeop; 115 reply: chan of string; 116 117 quit: fn(t: self ref Tree); 118 create: fn(t: self ref Tree, parent: big, d: Sys->Dir): string; 119 wstat: fn(t: self ref Tree, path: big, d: Sys->Dir): string; 120 remove: fn(t: self ref Tree, path: big): string; 121 getpath: fn(t: self ref Tree, path: big): string; 122 }; 123 Treeop: adt { 124 reply: chan of string; 125 q: big; 126 pick { 127 Create or 128 Wstat => 129 d: Sys->Dir; 130 Remove => 131 Getpath => 132 } 133 }; 134 init: fn(); 135 start: fn(): (ref Tree, chan of ref Styxservers->Navop); 136}; 137