.TH OP 2 .SH NAME Op, Rmsg, Tmsg, dir2text, istmsg, packdir, packdirsize, readmsg, qid2text, unpackdir \- interface to the Op file protocol .SH SYNOPSIS .EX include "op.m"; op := load Op Op->PATH; # Message types Tattach, # 1 Rattach, Terror, # 3 illegal Rerror, Tflush, # 5 Rflush, Tput, # 7 Rput, Tget, # 9 Rget, Tremove, # 11 Rremove, Tmax: con 1+iota; NOFD: con int ~0; MAXDATA: con 16*1024; # `reasonable' iounit (size of .data fields) 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. 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; .EE .SH DESCRIPTION .B Op provides a Limbo interface for speaking the Octopus File Protocol, Op. See .IR intro (O) for a description of the protocol. .PP .B Init initializes and prepares the module for operation. .PP .B Readmsg reads an Op message from .I fd (a maximum of .I msize bytes), and returns it as an array of bytes. The second member of the tuple returned is the error status (nil for no error). When .I msize is zero, a reasonable default is chosen by the module. .PP .B Istmsg returns non-zero if the array of bytes .I f corresponds to an Op .BR Tmsg . .B Tmsg.read is similar to .BR readmsg , but reads an Op .BR Tmsg and unpacks it using .BR Tmsg.unpack . .PP The converse of .B Tmsg.unpack is .BR Tmsg.pack . It packs a .BR Tmsg into network format, and returns the resulting array of bytes. The function .B Tmsg.packedsize may be used to obtain the size of a .B Tmsg while packed. .PP The function .B Tmsg.text returns a string with a printable representation of the message, for debugging. .PP In general, the adt for a .B Tmsg suffices. However, .I mtype returns a different (small) integer for different .B Tmsgs , representing its type. .PP The same set of operations are available for .B Rmsgs (they are not described again here). .PP As an aid, .B packdir packages a directory entry, .B packdirsize reports the size in bytes of a packed directory, and .B unpackdir unpacks a directory entry. These functions are only necessary for reading directories. Othersize, the .B stat fields in .B Tmsgs and .B Rmsgs suffice. .PP .B Dir2text and .B qid2text return printable strings for directory entries and qids, also for debugging purposes. .PP The meaning of the various constants defined is explained in section O of this manual. In general, directories and qids use the same name (and meaning) used in Styx. .SH SOURCE .B /usr/octopus/port/lib/op.b .SH SEE ALSO .IR intro (O), .IR opmux (2), and .IR intro (5).