Op: module { PATH: con "/dis/o/op.dis"; BIT8SZ: con 1; BIT16SZ: con 2; BIT32SZ: con 4; BIT64SZ: con 8; QIDSZ: con BIT8SZ+BIT32SZ+BIT64SZ; NOFD: con int ~0; STATFIXLEN: con BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+BIT64SZ; MAXDATA: con 16*1024; # `reasonable' iounit (size of .data fields) MAXHDR: con 1024; # reasonable size for biggest header Tattach, # 1 Rattach, Terror, # 3 illegal Rerror, Tflush, # 5 Rflush, Tput, # 7 Rput, Tget, # 9 Rget, Tremove, # 11 Rremove, Tmax: con 1+iota; ERRMAX: con 128; # mode bits in Tput/Tget.mode used by the protocol ODATA: con int 1 <<1; # put/get data OSTAT: con int 1 <<2; # put/get stat OCREATE: con int 1 <<3; # create the file (or truncate) OMORE: con int 1 <<4; # more data going/comming later OREMOVEC: con int 1 <<5; # remove after final put. # Qid.qtype (only QTDIR used by Op; all used by Styx). QTDIR: con 16r80; QTAPPEND: con 16r40; QTEXCL: con 16r20; QTAUTH: con 16r08; QTFILE: con 16r00; Tmsg: adt { tag: int; pick { Readerror => error: string; # tag is unused in this case Attach => uname: string; # user name responsible for rpcs path: string; # subtree we want to attach to. Flush => oldtag: int; # tag for flushed request Put => path: string; # of file fd: int; # for file mode : int; # bit-or of OSTAT|ODATA|OCREATE|OMORE stat: Sys->Dir; # for file offset: big; # for data data: array of byte; Get => path: string; # of file fd: int; # of file mode: int; # bit-or of OSTAT|ODATA|OMORE nmsgs: int; # max number of Rgets for reply. 0==unlimited. offset: big; # byte offset (ignored for dirs) count: int; # max data expected per message Remove => path: string; # of file } read: fn(fd: ref Sys->FD, msize: int): ref Tmsg; unpack: fn(a: array of byte): (int, ref Tmsg); pack: fn(nil: self ref Tmsg): array of byte; packedsize: fn(nil: self ref Tmsg): int; text: fn(nil: self ref Tmsg): string; mtype: fn(nil: self ref Tmsg): int; }; Rmsg: adt { tag: int; pick { Readerror => error: string; # tag is unused in this case Error => ename: string; Attach or Flush => Put => fd: int; count: int; qid: Sys->Qid; mtime: int; Get => fd: int; mode: int; # bit or of OSTAT|ODATA|OMORE stat: Sys->Dir; data: array of byte; Remove => } read: fn(fd: ref Sys->FD, msize: int): ref Rmsg; unpack: fn(a: array of byte): (int, ref Rmsg); pack: fn(nil: self ref Rmsg): array of byte; packedsize: fn(nil: self ref Rmsg): int; text: fn(nil: self ref Rmsg): string; mtype: fn(nil: self ref Rmsg): int; }; init: fn(); readmsg: fn(fd: ref Sys->FD, msize: int): (array of byte, string); istmsg: fn(f: array of byte): int; packdirsize: fn(d: Sys->Dir): int; packdir: fn(d: Sys->Dir): array of byte; unpackdir: fn(f: array of byte): (int, Sys->Dir); dir2text: fn(d: Sys->Dir): string; qid2text: fn(q: Sys->Qid): string; };