The following utilities are used in the Inferno file protocol:
#include <lib9.h> #include <styx.h>
A connection to a server is a bidirectional communication path from the client to the server. There may be a single client or multiple clients sharing the same connection. A server's file tree is attached to a process group's name space by bin and mount and calls. See bind and Limbo System Modules. Processes in the group are then clients of the servers. Their system calls operating on the server's files are translated into requests and transmitted over the connection to the appropriate server. The server's response completes the request.
The Inferno File Protocol, Styx, is used for messages between clients and servers. A client transmits requests (T-messages) to a server, which subsequently returns replies (R-messages) to the client. The combined acts of transmitting (receiving) a request of a particular type (e.g., read, write, stat) and receiving (transmitting) its reply is called a transaction of that type.
Message Format
Each message consists of a sequence of bytes. The first byte is the message type, one of the constants in the enumeration in the C include file <styx.h>. (See styx).
The remaining bytes are parameters. Each parameter consists of a fixed number of bytes (except the data fields of write requests or read replies). In the message descriptions below, the number of bytes in a field is given in brackets after the field name. The two-, four-, and eight-byte fields may hold unsigned integers represented in little-endian order (least significant byte first). Fields that contain names are 28-byte strings (including a terminal NUL (zero) byte).
Message Types
Tnop tag [2] Rnop tag [2] Rerror tag [2] ename [64] Tflush tag [2] oldtag [2] Rflush tag [2] Tattach tag [2] fid [2] uid [28] aname [28] Rattach tag [2] fid [2] qid [8] Tclone tag [2] fid [2] newfid [2] Rclone tag [2] fid [2] Twalk tag [2] fid [2] name [28] Rwalk tag [2] fid [2] qid [8] Topen tag [2] fid [2] mode [1] Ropen tag [2] fid [2] qid [8] Tcreate tag [2] fid [2] name [28] perm [4] mode [1] Rcreate tag [2] fid [2] qid [8] Tread tag [2] fid [2] offset [8] count [2] Rread tag [2] fid [2] count [2] pad [1] data [count] Twrite tag [2] fid [2] offset [8] count [2] pad [1] data [count] Rwrite tag [2] fid [2] count [2] Tclunk tag [2] fid [2] Rclunk tag [2] fid [2] Tremove tag [2] fid [2] Rremove tag [2] fid [2] Tstat tag [2] fid [2] Rstat tag [2] fid [2] stat [116] Twstat tag [2] fid [2] stat [116] Rwstat tag [2] fid [2]The numerical value for the type of an R-message will be one greater than that of the corresponding T-message. See styx. However, when a request fails a Rerror type message is sent instead. The Rerror message has an ename field which contains a string describing the reason for failure.
The nop message request has no obvious effect. Its main purpose is in debugging the connection between a client and a server. It is never required.
Fids
Most T-messages contain a fid, a 16-bit unsigned integer that the client uses to identify a current file on the server. Fids are like file descriptors in a user process, but they are not restricted to files open for I/O. They are also used when directories being examined, files are accessed by stat calls, and so on. All files being manipulated by the operating system are identified by fids. Fids are chosen by the client.
All requests on a connection share the same fid space. When several clients share a connection, the agent managing the sharing must arrange that no two clients choose the same fid.
Two files on the same server hierarchy are the same if and only if their qids
are the same.
Message Tags
Each T-message has a tag field, that chosen and used by the client to identify the message. The reply to the message will have the same tag. Clients must arrange that no two outstanding messages on the same connection have the same tag. An exception is the tag NOTAG, value 16rFFFF, meaning 'no tag'. The client can use the NOTAG message, when establishing a connection, to override tag matching in messages. Qids
Replies (R-messages) to attach, walk, open, and create requests convey a qid field back to the client. The qid represents the server's unique identification for the file being accessed:
NOTE:
The client may have multiple fids pointing to a single file on a server and hence having a single qid.
File Operations
An existing file can be open'ed or a new file may be create'd in the current directory. See open.
I/O of a given number of bytes (limit 8192) at a given offset on an open file is done by read and write. See read.
A client should clunk any fid that is no longer needed. See clunk.
The remove transaction deletes files. See remove.
The stat transaction retrieves information about the file. The stat field in the reply includes the file's name, access permissions (read, write and execute for owner, group and others), access and modification times, and owner and group identifications (each 28-byte strings). The wstat transaction allows some of a file's properties to be changed. See stat and stat.
A request can be aborted with a Tflush request. When a server receives a Tflush, it should not reply to the message with tag oldtag (unless it has already replied), and it should immediately send an Rflush. The client should ignore replies with tag oldtag until it gets the Rflush, at which point oldtag may be reused. See flush.
Directories
Directories are created by create with CHDIR set in the permissions argument (see stat). The members of a directory can be found with read.
All servers must support requests to walk from the current directory to the directory ".." (dot-dot, meaning parent directory) although, by convention, directories contain no explicit entry for ".." or "." (dot, current directory). The parent of the root directory of a server's tree is itself.
Access Permissions
Each file server maintains a set of user and group names. Each user can be a member of any number of groups.
Header Files
Header files are located as follows:
<lib9.h>
|
<inferno_root> <systarg> / <objtype> /include/lib9.h
|
<styx.h>
|
/include/styx.h
|
See Also
styx, Limbo Modules, bind, stat, prog, read, and stat