Some man pages.
This commit is contained in:
parent
2600337aa7
commit
058b0118a5
214 changed files with 17112 additions and 1999 deletions
630
man/man9/0intro.9p
Normal file
630
man/man9/0intro.9p
Normal file
|
|
@ -0,0 +1,630 @@
|
|||
.TH INTRO 9P
|
||||
.SH NAME
|
||||
intro \- introduction to the Plan 9 File Protocol, 9P
|
||||
.SH SYNOPSIS
|
||||
.B #include <fcall.h>
|
||||
.SH DESCRIPTION
|
||||
A Plan 9
|
||||
.I server
|
||||
is an agent that provides one or more hierarchical file systems
|
||||
\(em file trees \(em
|
||||
that may be accessed by Plan 9 processes.
|
||||
A server responds to requests by
|
||||
.I clients
|
||||
to navigate the hierarchy,
|
||||
and to create, remove, read, and write files.
|
||||
The prototypical server is a separate machine that stores
|
||||
large numbers of user files on permanent media;
|
||||
such a machine is called, somewhat confusingly, a
|
||||
.I file
|
||||
.IR server .
|
||||
Another possibility for a server is to synthesize
|
||||
files on demand, perhaps based on information on data structures
|
||||
maintained in memory; the
|
||||
.IR plumber (4)
|
||||
server is an example of such a server.
|
||||
.PP
|
||||
A
|
||||
.I 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.
|
||||
.PP
|
||||
The
|
||||
.IR "Plan 9 File Protocol" ,
|
||||
9P, is used for messages between
|
||||
.I clients
|
||||
and
|
||||
.IR servers .
|
||||
A client transmits
|
||||
.I requests
|
||||
.RI ( T-messages )
|
||||
to a server, which
|
||||
subsequently returns
|
||||
.I replies
|
||||
.RI ( R-messages )
|
||||
to the client.
|
||||
The combined acts of transmitting (receiving) a request of a particular type,
|
||||
and receiving (transmitting)
|
||||
its reply is called a
|
||||
.I transaction
|
||||
of that type.
|
||||
.PP
|
||||
Each message consists of a sequence of bytes.
|
||||
Two-, four-, and eight-byte fields hold unsigned
|
||||
integers represented in little-endian order
|
||||
(least significant byte first).
|
||||
Data items of larger or variable lengths are represented
|
||||
by a two-byte field specifying a count,
|
||||
.IR n ,
|
||||
followed by
|
||||
.I n
|
||||
bytes of data.
|
||||
Text strings are represented this way,
|
||||
with the text itself stored as a UTF-8
|
||||
encoded sequence of Unicode characters (see
|
||||
.IR utf (7)).
|
||||
Text strings in 9P messages are not
|
||||
.SM NUL\c
|
||||
-terminated:
|
||||
.I n
|
||||
counts the bytes of UTF-8 data, which include no final zero byte.
|
||||
The
|
||||
.SM NUL
|
||||
character is illegal in all text strings in 9P, and is therefore
|
||||
excluded from file names, user names, and so on.
|
||||
.PP
|
||||
Each 9P message begins with a four-byte size field
|
||||
specifying the length in bytes of the complete message including
|
||||
the four bytes of the size field itself.
|
||||
The next byte is the message type, one of the constants
|
||||
in the enumeration in the include file
|
||||
.BR <fcall.h> .
|
||||
The next two bytes are an identifying
|
||||
.IR tag ,
|
||||
described below.
|
||||
The remaining bytes are parameters of different sizes.
|
||||
In the message descriptions, the number of bytes in a field
|
||||
is given in brackets after the field name.
|
||||
The notation
|
||||
.IR parameter [ n ]
|
||||
where
|
||||
.I n
|
||||
is not a constant represents a variable-length parameter:
|
||||
.IR n [2]
|
||||
followed by
|
||||
.I n
|
||||
bytes of data forming the
|
||||
.IR parameter .
|
||||
The notation
|
||||
.IR string [ s ]
|
||||
(using a literal
|
||||
.I s
|
||||
character)
|
||||
is shorthand for
|
||||
.IR s [2]
|
||||
followed by
|
||||
.I s
|
||||
bytes of UTF-8 text.
|
||||
(Systems may choose to reduce the set of legal characters
|
||||
to reduce syntactic problems,
|
||||
for example to remove slashes from name components,
|
||||
but the protocol has no such restriction.
|
||||
Plan 9 names may contain any printable character (that is, any character
|
||||
outside hexadecimal 00-1F and 80-9F)
|
||||
except slash.)
|
||||
Messages are transported in byte form to allow for machine independence;
|
||||
.IR fcall (3)
|
||||
describes routines that convert to and from this form into a machine-dependent
|
||||
C structure.
|
||||
.SH MESSAGES
|
||||
.ta \w'\fLTsession 'u
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tversion
|
||||
.IR tag [2]
|
||||
.IR msize [4]
|
||||
.IR version [ s ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rversion
|
||||
.IR tag [2]
|
||||
.IR msize [4]
|
||||
.IR version [ s ]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tauth
|
||||
.IR tag [2]
|
||||
.IR afid [4]
|
||||
.IR uname [ s ]
|
||||
.IR aname [ s ]
|
||||
.br
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rauth
|
||||
.IR tag [2]
|
||||
.IR aqid [13]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Rerror
|
||||
.IR tag [2]
|
||||
.IR ename [ s ]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tflush
|
||||
.IR tag [2]
|
||||
.IR oldtag [2]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rflush
|
||||
.IR tag [2]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tattach
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR afid [4]
|
||||
.IR uname [ s ]
|
||||
.IR aname [ s ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rattach
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Twalk
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR newfid [4]
|
||||
.IR nwname [2]
|
||||
.IR nwname *( wname [ s ])
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwalk
|
||||
.IR tag [2]
|
||||
.IR nwqid [2]
|
||||
.IR nwqid *( wqid [13])
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Topen
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR mode [1]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Ropen
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IR iounit [4]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Topenfd
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR mode [1]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Ropenfd
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IR iounit [4]
|
||||
.IR unixfd [4]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tcreate
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR name [ s ]
|
||||
.IR perm [4]
|
||||
.IR mode [1]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rcreate
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IR iounit [4]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tread
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR offset [8]
|
||||
.IR count [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rread
|
||||
.IR tag [2]
|
||||
.IR count [4]
|
||||
.IR data [ count ]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Twrite
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR offset [8]
|
||||
.IR count [4]
|
||||
.IR data [ count ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwrite
|
||||
.IR tag [2]
|
||||
.IR count [4]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tclunk
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rclunk
|
||||
.IR tag [2]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tremove
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rremove
|
||||
.IR tag [2]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Tstat
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rstat
|
||||
.IR tag [2]
|
||||
.IR stat [ n ]
|
||||
.IP
|
||||
.ne 2v
|
||||
.IR size [4]
|
||||
.B Twstat
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR stat [ n ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwstat
|
||||
.IR tag [2]
|
||||
.PP
|
||||
Each T-message has a
|
||||
.I tag
|
||||
field, 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
|
||||
.BR NOTAG ,
|
||||
defined as
|
||||
.B (ushort)~0
|
||||
in
|
||||
.BR <fcall.h> :
|
||||
the client can use it, when establishing a connection,
|
||||
to
|
||||
override tag matching in
|
||||
.B version
|
||||
messages.
|
||||
.PP
|
||||
The type of an R-message will either be one greater than the type
|
||||
of the corresponding T-message or
|
||||
.BR Rerror ,
|
||||
indicating that the request failed.
|
||||
In the latter case, the
|
||||
.I ename
|
||||
field contains a string describing the reason for failure.
|
||||
.PP
|
||||
The
|
||||
.B version
|
||||
message identifies the version of the protocol and indicates
|
||||
the maximum message size the system is prepared to handle.
|
||||
It also initializes the connection and
|
||||
aborts all outstanding I/O on the connection.
|
||||
The set of messages between
|
||||
.B version
|
||||
requests is called a
|
||||
.IR session .
|
||||
.PP
|
||||
Most T-messages contain a
|
||||
.IR fid ,
|
||||
a 32-bit unsigned integer that the client uses to identify
|
||||
a ``current file'' on the server.
|
||||
Fids are somewhat like file descriptors in a user process,
|
||||
but they are not restricted to files open for I/O:
|
||||
directories being examined, files being accessed by
|
||||
.IR stat (3)
|
||||
calls, and so on \(em all files being manipulated by the operating
|
||||
system \(em 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.
|
||||
.PP
|
||||
The fid supplied in an
|
||||
.B attach
|
||||
message
|
||||
will be taken by the server to refer to the root of the served file tree.
|
||||
The
|
||||
.B attach
|
||||
identifies the user
|
||||
to the server and may specify a particular file tree served
|
||||
by the server (for those that supply more than one).
|
||||
.PP
|
||||
Permission to attach to the service is proven by providing a special fid, called
|
||||
.BR afid ,
|
||||
in the
|
||||
.B attach
|
||||
message. This
|
||||
.B afid
|
||||
is established by exchanging
|
||||
.B auth
|
||||
messages and subsequently manipulated using
|
||||
.B read
|
||||
and
|
||||
.B write
|
||||
messages to exchange authentication information not defined explicitly by 9P.
|
||||
Once the authentication protocol is complete, the
|
||||
.B afid
|
||||
is presented in the
|
||||
.B attach
|
||||
to permit the user to access the service.
|
||||
.PP
|
||||
A
|
||||
.B walk
|
||||
message causes the server to change the current file associated
|
||||
with a fid to be a file in the directory that is the old current file, or one of
|
||||
its subdirectories.
|
||||
.B Walk
|
||||
returns a new fid that refers to the resulting file.
|
||||
Usually, a client maintains a fid for the root,
|
||||
and navigates by
|
||||
.B walks
|
||||
from the root fid.
|
||||
.PP
|
||||
A client can send multiple T-messages without waiting for the corresponding
|
||||
R-messages, but all outstanding T-messages must specify different tags.
|
||||
The server may delay the response to a request
|
||||
and respond to later ones;
|
||||
this is sometimes necessary, for example when the client reads
|
||||
from a file that the server synthesizes from external events
|
||||
such as keyboard characters.
|
||||
.PP
|
||||
Replies (R-messages) to
|
||||
.BR auth ,
|
||||
.BR attach ,
|
||||
.BR walk ,
|
||||
.BR open ,
|
||||
and
|
||||
.B create
|
||||
requests convey a
|
||||
.I qid
|
||||
field back to the client.
|
||||
The qid represents the server's unique identification for the
|
||||
file being accessed:
|
||||
two files on the same server hierarchy are the same if and only if their qids
|
||||
are the same.
|
||||
(The client may have multiple fids pointing to a single file on a server
|
||||
and hence having a single qid.)
|
||||
The thirteen-byte qid fields hold a one-byte type,
|
||||
specifying whether the file is a directory, append-only file, etc.,
|
||||
and two unsigned integers:
|
||||
first the four-byte qid
|
||||
.IR version ,
|
||||
then the eight-byte qid
|
||||
.IR path .
|
||||
The path is an integer unique among all files in the hierarchy.
|
||||
If a file is deleted and recreated with the
|
||||
same name in the same directory, the old and new path components of the qids
|
||||
should be different.
|
||||
The version is a version number for a file;
|
||||
typically, it is incremented every time the file is modified.
|
||||
.PP
|
||||
An existing file can be
|
||||
.BR opened ,
|
||||
or a new file may be
|
||||
.B created
|
||||
in the current (directory) file.
|
||||
I/O of a given number of bytes
|
||||
at a given offset
|
||||
on an open file is done by
|
||||
.B read
|
||||
and
|
||||
.BR write .
|
||||
.PP
|
||||
A client should
|
||||
.B clunk
|
||||
any fid that is no longer needed.
|
||||
The
|
||||
.B remove
|
||||
transaction deletes files.
|
||||
.PP
|
||||
.B Openfd
|
||||
is an extension used by Unix utilities to allow traditional Unix programs
|
||||
to have their input or output attached to fids on 9P servers.
|
||||
See
|
||||
.IR openfd (9p)
|
||||
and
|
||||
.IR 9pclient (3)
|
||||
for details.
|
||||
.PP
|
||||
The
|
||||
.B stat
|
||||
transaction retrieves information about the file.
|
||||
The
|
||||
.I stat
|
||||
field in the reply includes the file's
|
||||
name,
|
||||
access permissions (read, write and execute for owner, group and public),
|
||||
access and modification times, and
|
||||
owner and group identifications
|
||||
(see
|
||||
.IR stat (3)).
|
||||
The owner and group identifications are textual names.
|
||||
The
|
||||
.B wstat
|
||||
transaction allows some of a file's properties
|
||||
to be changed.
|
||||
.PP
|
||||
A request can be aborted with a
|
||||
flush
|
||||
request.
|
||||
When a server receives a
|
||||
.BR Tflush ,
|
||||
it should not reply to the message with tag
|
||||
.I oldtag
|
||||
(unless it has already replied),
|
||||
and it should immediately send an
|
||||
.BR Rflush .
|
||||
The client must wait
|
||||
until it gets the
|
||||
.B Rflush
|
||||
(even if the reply to the original message arrives in the interim),
|
||||
at which point
|
||||
.I oldtag
|
||||
may be reused.
|
||||
.PP
|
||||
Because the message size is negotiable and some elements of the
|
||||
protocol are variable length, it is possible (although unlikely) to have
|
||||
a situation where a valid message is too large to fit within the negotiated size.
|
||||
For example, a very long file name may cause a
|
||||
.B Rstat
|
||||
of the file or
|
||||
.B Rread
|
||||
of its directory entry to be too large to send.
|
||||
In most such cases, the server should generate an error rather than
|
||||
modify the data to fit, such as by truncating the file name.
|
||||
The exception is that a long error string in an
|
||||
.B Rerror
|
||||
message should be truncated if necessary, since the string is only
|
||||
advisory and in some sense arbitrary.
|
||||
.PP
|
||||
Most programs do not see the 9P protocol directly;
|
||||
on Plan 9, calls to library
|
||||
routines that access files are
|
||||
translated by the kernel's mount driver
|
||||
into 9P messages.
|
||||
.SS Unix
|
||||
On Unix, 9P services are posted as Unix domain sockets in a
|
||||
well-known directory (see
|
||||
.IR getns (3)
|
||||
and
|
||||
.IR 9pserve (4)).
|
||||
Clients connect to these servers using a 9P client library
|
||||
(see
|
||||
.IR 9pclient (3)).
|
||||
.SH DIRECTORIES
|
||||
Directories are created by
|
||||
.B create
|
||||
with
|
||||
.B DMDIR
|
||||
set in the permissions argument (see
|
||||
.IR stat (9P)).
|
||||
The members of a directory can be found with
|
||||
.IR read (9P).
|
||||
All directories must support
|
||||
.B walks
|
||||
to the directory
|
||||
.B ..
|
||||
(dot-dot)
|
||||
meaning parent directory, although by convention directories
|
||||
contain no explicit entry for
|
||||
.B ..
|
||||
or
|
||||
.B .
|
||||
(dot).
|
||||
The parent of the root directory of a server's tree is itself.
|
||||
.SH "ACCESS PERMISSIONS"
|
||||
This section describes the access permission conventions
|
||||
implemented by most Plan 9 file servers. These conventions
|
||||
are not enforced by the protocol and may differ between servers,
|
||||
especially servers built on top of foreign operating systems.
|
||||
.PP
|
||||
Each file server maintains a set of user and group names.
|
||||
Each user can be a member of any number of groups.
|
||||
Each group has a
|
||||
.I group leader
|
||||
who has special privileges (see
|
||||
.IR stat (9P)
|
||||
and
|
||||
Plan 9's \fIusers\fR(6)).
|
||||
Every file request has an implicit user id (copied from the original
|
||||
.BR attach )
|
||||
and an implicit set of groups (every group of which the user is a member).
|
||||
.PP
|
||||
Each file has an associated
|
||||
.I owner
|
||||
and
|
||||
.I group
|
||||
id and
|
||||
three sets of permissions:
|
||||
those of the owner, those of the group, and those of ``other'' users.
|
||||
When the owner attempts to do something to a file, the owner, group,
|
||||
and other permissions are consulted, and if any of them grant
|
||||
the requested permission, the operation is allowed.
|
||||
For someone who is not the owner, but is a member of the file's group,
|
||||
the group and other permissions are consulted.
|
||||
For everyone else, the other permissions are used.
|
||||
Each set of permissions says whether reading is allowed,
|
||||
whether writing is allowed, and whether executing is allowed.
|
||||
A
|
||||
.B walk
|
||||
in a directory is regarded as executing the directory,
|
||||
not reading it.
|
||||
Permissions are kept in the low-order bits of the file
|
||||
.IR mode :
|
||||
owner read/write/execute permission represented as 1 in bits 8, 7, and 6
|
||||
respectively (using 0 to number the low order).
|
||||
The group permissions are in bits 5, 4, and 3,
|
||||
and the other permissions are in bits 2, 1, and 0.
|
||||
.PP
|
||||
The file
|
||||
.I mode
|
||||
contains some additional attributes besides the permissions.
|
||||
If bit 31
|
||||
.RB ( DMDIR )
|
||||
is set, the file is a directory;
|
||||
if bit 30
|
||||
.RB ( DMAPPEND )
|
||||
is set, the file is append-only (offset is ignored in writes);
|
||||
if bit 29
|
||||
.RB ( DMEXCL )
|
||||
is set, the file is exclusive-use (only one client may have it
|
||||
open at a time);
|
||||
if bit 27
|
||||
.RB ( DMAUTH )
|
||||
is set, the file is an authentication file established by
|
||||
.B auth
|
||||
messages;
|
||||
if bit 26
|
||||
.RB ( DMTMP )
|
||||
is set, the contents of the file (or directory) are not included in nightly archives.
|
||||
(Bit 28 is skipped for historical reasons.)
|
||||
These bits are reproduced, from the top bit down, in the type byte of the Qid:
|
||||
.BR QTDIR ,
|
||||
.BR QTAPPEND ,
|
||||
.BR QTEXCL ,
|
||||
(skipping one bit)
|
||||
.BR QTAUTH ,
|
||||
and
|
||||
.BR QTTMP .
|
||||
The name
|
||||
.BR QTFILE ,
|
||||
defined to be zero,
|
||||
identifies the value of the type for a plain file.
|
||||
16
man/man9/INDEX
Normal file
16
man/man9/INDEX
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
0intro 0intro.9p
|
||||
intro 0intro.9p
|
||||
attach attach.9p
|
||||
auth attach.9p
|
||||
clunk clunk.9p
|
||||
error error.9p
|
||||
flush flush.9p
|
||||
create open.9p
|
||||
open open.9p
|
||||
read read.9p
|
||||
write read.9p
|
||||
remove remove.9p
|
||||
stat stat.9p
|
||||
wstat stat.9p
|
||||
version version.9p
|
||||
walk walk.9p
|
||||
168
man/man9/attach.9p
Normal file
168
man/man9/attach.9p
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
.TH ATTACH 9P
|
||||
.SH NAME
|
||||
attach, auth \- messages to establish a connection
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTauth 'u
|
||||
.IR size [4]
|
||||
.B Tauth
|
||||
.IR tag [2]
|
||||
.IR afid [4]
|
||||
.IR uname [ s ]
|
||||
.IR aname [ s ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rauth
|
||||
.IR tag [2]
|
||||
.IR aqid [13]
|
||||
.PP
|
||||
.IR size [4]
|
||||
.B Tattach
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR afid [4]
|
||||
.IR uname [ s ]
|
||||
.IR aname [ s ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rattach
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
The
|
||||
.B attach
|
||||
message serves as a fresh introduction from a user on
|
||||
the client machine to the server.
|
||||
The message identifies the user
|
||||
.RI ( uname )
|
||||
and may select
|
||||
the file tree to access
|
||||
.RI ( aname ).
|
||||
The
|
||||
.I afid
|
||||
argument specifies a fid previously established by an
|
||||
.B auth
|
||||
message, as described below.
|
||||
.PP
|
||||
As a result of the
|
||||
.B attach
|
||||
transaction, the client will have a connection to the root
|
||||
directory of the desired file tree,
|
||||
represented by
|
||||
.IR fid .
|
||||
An error is returned if
|
||||
.I fid
|
||||
is already in use.
|
||||
The server's idea of the root of the file tree is represented by the returned
|
||||
.IR qid .
|
||||
.PP
|
||||
If the client does not wish to authenticate the connection, or knows that
|
||||
authentication is not required, the
|
||||
.I afid
|
||||
field in the
|
||||
.B attach
|
||||
message should be set to
|
||||
.BR NOFID ,
|
||||
defined as
|
||||
.B (u32int)~0
|
||||
in
|
||||
.BR <fcall.h> .
|
||||
If the client does wish to authenticate, it must acquire and validate an
|
||||
.I afid
|
||||
using an
|
||||
.B auth
|
||||
message before doing the
|
||||
.BR attach .
|
||||
.PP
|
||||
The
|
||||
.B auth
|
||||
message contains
|
||||
.IR afid ,
|
||||
a new fid to be established for authentication, and the
|
||||
.I uname
|
||||
and
|
||||
.I aname
|
||||
that will be those of the following
|
||||
.B attach
|
||||
message.
|
||||
If the server does not require authentication, it returns
|
||||
.B Rerror
|
||||
to the
|
||||
.B Tauth
|
||||
message.
|
||||
.PP
|
||||
If the server does require authentication, it returns
|
||||
.I aqid
|
||||
defining a file of type
|
||||
.B QTAUTH
|
||||
(see
|
||||
.IR intro (9P))
|
||||
that may be read and written (using
|
||||
.B read
|
||||
and
|
||||
.B write
|
||||
messages in the usual way) to execute an authentication protocol.
|
||||
That protocol's definition is not part of 9P itself.
|
||||
.PP
|
||||
Once the protocol is complete, the same
|
||||
.I afid
|
||||
is presented in the
|
||||
.B attach
|
||||
message for the user, granting entry.
|
||||
The same validated
|
||||
.I afid
|
||||
may be used for multiple
|
||||
.B attach
|
||||
messages with the same
|
||||
.I uname
|
||||
and
|
||||
.IR aname .
|
||||
.SH ENTRY POINTS
|
||||
.I Fsmount
|
||||
and
|
||||
.I fsauth
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
generate
|
||||
.B attach
|
||||
and
|
||||
.B auth
|
||||
transactions.
|
||||
.\" An
|
||||
.\" .B attach
|
||||
.\" transaction will be generated for kernel devices
|
||||
.\" (see
|
||||
.\" .IR intro (3))
|
||||
.\" when a system call evaluates a file name
|
||||
.\" beginning with
|
||||
.\" .LR # .
|
||||
.\" .IR Pipe (2)
|
||||
.\" generates an attach on the kernel device
|
||||
.\" .IR pipe (3).
|
||||
.\" The
|
||||
.\" .I mount
|
||||
.\" system call
|
||||
.\" (see
|
||||
.\" .IR bind (2))
|
||||
.\" generates an
|
||||
.\" .B attach
|
||||
.\" message to the remote file server.
|
||||
.\" When the kernel boots, an
|
||||
.\" .I attach
|
||||
.\" is made to the root device,
|
||||
.\" .IR root (3),
|
||||
.\" and then an
|
||||
.\" .B attach
|
||||
.\" is made to the requested file server machine.
|
||||
.\" .PP
|
||||
.\" An
|
||||
.\" .B auth
|
||||
.\" transaction is generated by the
|
||||
.\" .IR fauth (2)
|
||||
.\" system call or by the first
|
||||
.\" .B mount
|
||||
.\" system call on an uninitialized connection.
|
||||
.SH SEE ALSO
|
||||
.IR 9pclient (3),
|
||||
.IR version (9P),
|
||||
Plan 9's \fIauthsrv\fR(6)
|
||||
55
man/man9/clunk.9p
Normal file
55
man/man9/clunk.9p
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
.TH CLUNK 9P
|
||||
.SH NAME
|
||||
clunk \- forget about a fid
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTclunk 'u
|
||||
.IR size [4]
|
||||
.B Tclunk
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rclunk
|
||||
.IR tag [2]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B clunk
|
||||
request informs the file server
|
||||
that the current file represented by
|
||||
.I fid
|
||||
is no longer needed by the client.
|
||||
The actual file is not removed on the server unless the fid had been opened with
|
||||
.BR ORCLOSE .
|
||||
.PP
|
||||
Once a fid has been clunked,
|
||||
the same fid can be reused in a new
|
||||
.B walk
|
||||
or
|
||||
.B attach
|
||||
request.
|
||||
.PP
|
||||
Even if the
|
||||
.B clunk
|
||||
returns an error, the
|
||||
.I fid
|
||||
is no longer valid.
|
||||
.SH ENTRY POINTS
|
||||
.B Clunk
|
||||
transactions are
|
||||
generated by
|
||||
.I fsclose
|
||||
and
|
||||
.I fsunmount
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
and indirectly by other actions such as failed
|
||||
.I fsopen
|
||||
calls.
|
||||
.\"
|
||||
.\" A
|
||||
.\" .B clunk
|
||||
.\" message is generated by
|
||||
.\" .I close
|
||||
.\" and indirectly by other actions such as failed
|
||||
.\" .I open
|
||||
.\" calls.
|
||||
28
man/man9/error.9p
Normal file
28
man/man9/error.9p
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
.TH ERROR 9P
|
||||
.SH NAME
|
||||
error \- return an error
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLRerror 'u
|
||||
.IR size [4]
|
||||
.B Rerror
|
||||
.IR tag [2]
|
||||
.IR ename [ s ]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B Rerror
|
||||
message
|
||||
(there is no
|
||||
.BR Terror )
|
||||
is used to return an error string
|
||||
describing the
|
||||
failure of a transaction.
|
||||
It replaces the corresponding reply message
|
||||
that would accompany a successful call; its tag is that
|
||||
of the failing request.
|
||||
.PP
|
||||
By convention, clients may truncate error messages after
|
||||
.B ERRMAX-1
|
||||
bytes;
|
||||
.B ERRMAX
|
||||
is defined in
|
||||
.BR <libc.h> .
|
||||
109
man/man9/flush.9p
Normal file
109
man/man9/flush.9p
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
.TH FLUSH 9P
|
||||
.SH NAME
|
||||
flush \- abort a message
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTflush 'u
|
||||
.IR size [4]
|
||||
.B Tflush
|
||||
.IR tag [2]
|
||||
.IR oldtag [2]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rflush
|
||||
.IR tag [2]
|
||||
.SH DESCRIPTION
|
||||
When the response to a request is no longer needed, such as when
|
||||
a user interrupts a process doing a
|
||||
.IR read (9p),
|
||||
a
|
||||
.B Tflush
|
||||
request is sent to the server to purge the pending response.
|
||||
The message being flushed is identified by
|
||||
.IR oldtag .
|
||||
The semantics of
|
||||
.B flush
|
||||
depends on messages arriving in order.
|
||||
.PP
|
||||
The server should answer the
|
||||
.B flush
|
||||
message immediately.
|
||||
If it recognizes
|
||||
.I oldtag
|
||||
as the tag of a pending transaction, it should abort any pending response
|
||||
and discard that tag.
|
||||
In either case, it should respond with an
|
||||
.B Rflush
|
||||
echoing the
|
||||
.I tag
|
||||
(not
|
||||
.IR oldtag )
|
||||
of the
|
||||
.B Tflush
|
||||
message.
|
||||
A
|
||||
.B Tflush
|
||||
can never be responded to by an
|
||||
.B Rerror
|
||||
message.
|
||||
.PP
|
||||
The server may respond to the pending request before
|
||||
responding to the
|
||||
.BR Tflush .
|
||||
It is possible for a client to send multiple
|
||||
.B Tflush
|
||||
messages for a particular pending request. Each
|
||||
subsequent
|
||||
.B Tflush
|
||||
must contain as
|
||||
.I oldtag
|
||||
the tag of the pending request (not a previous
|
||||
.BR Tflush ).
|
||||
Should multiple
|
||||
.BR Tflush es
|
||||
be received for a pending request, they must be answered in
|
||||
order. A
|
||||
.B Rflush
|
||||
for any of the multiple
|
||||
.BR Tflush es
|
||||
implies an answer for all previous ones. Therefore, should
|
||||
a server receive a request and then multiple flushes for that
|
||||
request, it need respond only to the last flush.
|
||||
.PP
|
||||
When the client sends a
|
||||
.BR Tflush ,
|
||||
it must wait to receive the corresponding
|
||||
.B Rflush
|
||||
before reusing
|
||||
.I oldtag
|
||||
for subsequent messages.
|
||||
If a response to the flushed request is received before the
|
||||
.BR Rflush ,
|
||||
the client must honor the response
|
||||
as if it had not been flushed,
|
||||
since the completed request may signify a state change in the server.
|
||||
For instance,
|
||||
.B Tcreate
|
||||
may have created a file and
|
||||
.B Twalk
|
||||
may have allocated a fid.
|
||||
If no response is received before the
|
||||
.BR Rflush ,
|
||||
the flushed transaction is considered to have been canceled,
|
||||
and should be treated as though it had never been sent.
|
||||
.PP
|
||||
Several exceptional conditions are handled correctly by the above specification:
|
||||
sending multiple flushes for a single tag,
|
||||
flushing after a transaction is completed,
|
||||
flushing a
|
||||
.BR Tflush ,
|
||||
and flushing an invalid tag.
|
||||
.SH ENTRY POINTS
|
||||
The
|
||||
.IR 9pclient (3)
|
||||
library does not generate
|
||||
.B flush
|
||||
transactions..
|
||||
.IR 9pserve (4)
|
||||
generates
|
||||
.B flush
|
||||
transactions to cancel transactions pending when a client hangs up.
|
||||
249
man/man9/open.9p
Normal file
249
man/man9/open.9p
Normal file
|
|
@ -0,0 +1,249 @@
|
|||
.TH OPEN 9P
|
||||
.SH NAME
|
||||
open, create \- prepare a fid for I/O on an existing or new file
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTcreate 'u
|
||||
.IR size [4]
|
||||
.B Topen
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR mode [1]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Ropen
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IR iounit [4]
|
||||
.PP
|
||||
.IR size [4]
|
||||
.B Tcreate
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR name [ s ]
|
||||
.IR perm [4]
|
||||
.IR mode [1]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rcreate
|
||||
.IR tag [2]
|
||||
.IR qid [13]
|
||||
.IR iounit [4]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B open
|
||||
request asks the file server to check permissions and
|
||||
prepare a fid for I/O with subsequent
|
||||
.B read
|
||||
and
|
||||
.B write
|
||||
messages.
|
||||
The
|
||||
.I mode
|
||||
field determines the type of I/O:
|
||||
0
|
||||
(called
|
||||
.BR OREAD
|
||||
in
|
||||
.BR <libc.h> ),
|
||||
1
|
||||
.RB ( OWRITE ),
|
||||
2
|
||||
.RB ( ORDWR ),
|
||||
and 3
|
||||
.RB ( OEXEC )
|
||||
mean
|
||||
.I
|
||||
read access, write access, read and write access,
|
||||
and
|
||||
.I
|
||||
execute access,
|
||||
to be checked against the permissions for the file.
|
||||
In addition, if
|
||||
.I mode
|
||||
has the
|
||||
.B OTRUNC
|
||||
.RB ( 0x10 )
|
||||
bit set,
|
||||
the file is to be truncated, which requires write permission
|
||||
(if
|
||||
the file is append-only, and permission is granted, the
|
||||
.B open
|
||||
succeeds but the file will not be truncated);
|
||||
if the
|
||||
.I mode
|
||||
has the
|
||||
.B ORCLOSE
|
||||
.RB ( 0x40 )
|
||||
bit set, the file is to be removed when the fid
|
||||
is clunked, which requires permission to remove the file from its directory.
|
||||
All other bits in
|
||||
.I mode
|
||||
should be zero.
|
||||
It is illegal to write a directory, truncate it, or attempt to remove it on close.
|
||||
If the file is marked for exclusive use (see
|
||||
.IR stat (9P)),
|
||||
only one client can have the file open at any time.
|
||||
That is, after such a file has been opened,
|
||||
further opens will fail until
|
||||
.I fid
|
||||
has been clunked.
|
||||
All these permissions are checked at the time of the
|
||||
.B open
|
||||
request; subsequent changes to the permissions of files do not affect
|
||||
the ability to read, write, or remove an open file.
|
||||
.PP
|
||||
The
|
||||
.B create
|
||||
request asks the file server to create a new file
|
||||
with the
|
||||
.I name
|
||||
supplied, in the directory
|
||||
.RI ( dir )
|
||||
represented by
|
||||
.IR fid ,
|
||||
and requires write permission in the directory.
|
||||
The owner of the file is the implied user id of the request,
|
||||
the group of the file is the same as
|
||||
.IR dir ,
|
||||
and the permissions are the value of
|
||||
.ce
|
||||
.B "perm & (~0666 | (dir.perm & 0666))"
|
||||
if a regular file is being created and
|
||||
.ce
|
||||
.B "perm & (~0777 | (dir.perm & 0777))"
|
||||
if a directory is being created.
|
||||
This means, for example, that if the
|
||||
.B create
|
||||
allows read permission to others, but the containing directory
|
||||
does not, then the created file will not allow others to read the file.
|
||||
.PP
|
||||
Finally, the newly created file is opened according to
|
||||
.IR mode ,
|
||||
and
|
||||
.I fid
|
||||
will represent the newly opened file.
|
||||
.I Mode
|
||||
is not checked against the permissions in
|
||||
.IR perm .
|
||||
The
|
||||
.I qid
|
||||
for the new file is returned with the
|
||||
.B create
|
||||
reply message.
|
||||
.PP
|
||||
Directories are created by setting the
|
||||
.B DMDIR
|
||||
bit
|
||||
.RB ( 0x80000000 )
|
||||
in the
|
||||
.IR perm .
|
||||
.PP
|
||||
The names
|
||||
.B .
|
||||
and
|
||||
.B ..
|
||||
are special; it is illegal to create files with these names.
|
||||
.PP
|
||||
It is an error for either of these messages if the fid
|
||||
is already the product of a successful
|
||||
.B open
|
||||
or
|
||||
.B create
|
||||
message.
|
||||
.PP
|
||||
An attempt to
|
||||
.B create
|
||||
a file in a directory where the given
|
||||
.I name
|
||||
already exists will be rejected;
|
||||
in this case, the
|
||||
.I fscreate
|
||||
call
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
uses
|
||||
.B open
|
||||
with truncation.
|
||||
The algorithm used by the
|
||||
.IR create
|
||||
system call
|
||||
is:
|
||||
first walk to the directory to contain the file.
|
||||
If that fails, return an error.
|
||||
Next
|
||||
.B walk
|
||||
to the specified file.
|
||||
If the
|
||||
.B walk
|
||||
succeeds, send a request to
|
||||
.B open
|
||||
and truncate the file and return the result, successful or not.
|
||||
If the
|
||||
.B walk
|
||||
fails, send a create message.
|
||||
If that fails, it may be because the file was created by another
|
||||
process after the previous walk failed, so (once) try the
|
||||
.B walk
|
||||
and
|
||||
.B open
|
||||
again.
|
||||
.\" .PP
|
||||
.\" For the behavior of
|
||||
.\" .I create
|
||||
.\" on a union directory, see
|
||||
.\" .IR bind (2).
|
||||
.\" .PP
|
||||
.\" The
|
||||
.\" .B iounit
|
||||
.\" field returned by
|
||||
.\" .B open
|
||||
.\" and
|
||||
.\" .B create
|
||||
.\" may be zero.
|
||||
.\" If it is not, it is the maximum number of bytes that are guaranteed to
|
||||
.\" be read from or written to the file without breaking the I/O transfer
|
||||
.\" into multiple 9P messages; see
|
||||
.\" .IR read (9P).
|
||||
.SH ENTRY POINTS
|
||||
.I Fsopen
|
||||
and
|
||||
.I fscreate
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
both generate
|
||||
.B open
|
||||
messages; only
|
||||
.I fscreate
|
||||
generates a
|
||||
.B create
|
||||
message.
|
||||
The
|
||||
.B iounit
|
||||
associated with an open file may be discovered by calling
|
||||
.IR fsiounit .
|
||||
.PP
|
||||
For programs that need atomic file creation, without the race
|
||||
that exists in the
|
||||
.B open-create
|
||||
sequence described above,
|
||||
.IR fscreate
|
||||
does the following.
|
||||
If the
|
||||
.B OEXCL
|
||||
.RB ( 0x1000 )
|
||||
bit is set in the
|
||||
.I mode
|
||||
for a
|
||||
.I fscreate
|
||||
call,
|
||||
the
|
||||
.B open
|
||||
message is not sent; the kernel issues only the
|
||||
.BR create .
|
||||
Thus, if the file exists,
|
||||
.I fscreate
|
||||
will draw an error, but if it doesn't and the
|
||||
.I fscreate
|
||||
call succeeds, the process issuing the
|
||||
.I fscreate
|
||||
is guaranteed to be the one that created the file.
|
||||
126
man/man9/read.9p
Normal file
126
man/man9/read.9p
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
.TH READ 9P
|
||||
.SH NAME
|
||||
read, write \- transfer data from and to a file
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTwrite 'u
|
||||
.IR size [4]
|
||||
.B Tread
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR offset [8]
|
||||
.IR count [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rread
|
||||
.IR tag [2]
|
||||
.IR count [4]
|
||||
.IR data [ count ]
|
||||
.PP
|
||||
.IR size [4]
|
||||
.B Twrite
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR offset [8]
|
||||
.IR count [4]
|
||||
.IR data [ count ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwrite
|
||||
.IR tag [2]
|
||||
.IR count [4]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B read
|
||||
request
|
||||
asks for
|
||||
.I count
|
||||
bytes of data
|
||||
from the file identified by
|
||||
.IR fid ,
|
||||
which must be opened for reading,
|
||||
starting
|
||||
.I offset
|
||||
bytes after the beginning of the file.
|
||||
The bytes are returned with the
|
||||
.B read
|
||||
reply message.
|
||||
.PP
|
||||
The
|
||||
.I count
|
||||
field in the reply indicates the number of bytes returned.
|
||||
This may be less than the requested amount.
|
||||
If the
|
||||
.I offset
|
||||
field is greater than or equal to the number of bytes in the file,
|
||||
a count of zero will be returned.
|
||||
.PP
|
||||
For directories,
|
||||
.B read
|
||||
returns an integral number of
|
||||
directory entries exactly as in
|
||||
.B stat
|
||||
(see
|
||||
.IR stat (9P)),
|
||||
one for each member of the directory.
|
||||
The
|
||||
.B read
|
||||
request message must have
|
||||
.B offset
|
||||
equal to zero or the value of
|
||||
.B offset
|
||||
in the previous
|
||||
.B read
|
||||
on the directory, plus the number of bytes
|
||||
returned in the previous
|
||||
.BR read .
|
||||
In other words, seeking other than to the beginning
|
||||
is illegal in a directory.
|
||||
.PP
|
||||
The
|
||||
.B write
|
||||
request asks that
|
||||
.I count
|
||||
bytes of data be recorded in the file identified by
|
||||
.IR fid ,
|
||||
which must be opened for writing, starting
|
||||
.I offset
|
||||
bytes after the beginning of the file.
|
||||
If the file is append-only,
|
||||
the data will be placed at the end of the file regardless of
|
||||
.IR offset .
|
||||
Directories may not be written.
|
||||
.PP
|
||||
The
|
||||
.B write
|
||||
reply records the number of bytes actually written.
|
||||
It is usually an error
|
||||
if this is not the same as requested.
|
||||
.PP
|
||||
Because 9P implementations may limit the size of individual
|
||||
messages,
|
||||
more than one message may be produced by a single
|
||||
.I read
|
||||
or
|
||||
.I write
|
||||
call.
|
||||
The
|
||||
.I iounit
|
||||
field returned by
|
||||
.IR open (9P),
|
||||
if non-zero, reports the maximum size that is guaranteed
|
||||
to be transferred atomically.
|
||||
.SH ENTRY POINTS
|
||||
.I Fsread
|
||||
and
|
||||
.I fswrite
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
generate the corresponding messages.
|
||||
Because they take an offset parameter, the
|
||||
.I fspread
|
||||
and
|
||||
.I fspwrite
|
||||
calls correspond more directly to the 9P messages.
|
||||
Although
|
||||
.I fsseek
|
||||
affects the offset, it does not generate a message.
|
||||
51
man/man9/remove.9p
Normal file
51
man/man9/remove.9p
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
.TH REMOVE 9P
|
||||
.SH NAME
|
||||
remove \- remove a file from a server
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTremove 'u
|
||||
.IR size [4]
|
||||
.B Tremove
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rremove
|
||||
.IR tag [2]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B remove
|
||||
request asks the file server both to remove the file represented by
|
||||
.I fid
|
||||
and to
|
||||
.B clunk
|
||||
the
|
||||
.IR fid ,
|
||||
even if the remove fails.
|
||||
This request will fail if the client does not have write permission
|
||||
in the parent directory.
|
||||
.PP
|
||||
It is correct to consider
|
||||
.B remove
|
||||
to be a
|
||||
.B clunk
|
||||
with the side effect of removing the file if permissions allow.
|
||||
.PP
|
||||
If a file has been opened as multiple fids,
|
||||
possibly on different connections,
|
||||
and one fid is used to remove the file,
|
||||
whether the other fids continue to provide access to the file
|
||||
is implementation-defined.
|
||||
The Plan 9 file servers
|
||||
remove the file immediately: attempts to use the other fids
|
||||
will yield a
|
||||
``phase error.''
|
||||
.IR U9fs
|
||||
follows the semantics of the underlying Unix file system,
|
||||
so other fids typically remain usable.
|
||||
.SH ENTRY POINTS
|
||||
.I Fsremove
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
generates
|
||||
.B remove
|
||||
messages.
|
||||
297
man/man9/stat.9p
Normal file
297
man/man9/stat.9p
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
.TH STAT 9P
|
||||
.SH NAME
|
||||
stat, wstat \- inquire or change file attributes
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTwstat 'u
|
||||
.IR size [4]
|
||||
.B Tstat
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rstat
|
||||
.IR tag [2]
|
||||
.IR stat [ n ]
|
||||
.PP
|
||||
.IR size [4]
|
||||
.B Twstat
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR stat [ n ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwstat
|
||||
.IR tag [2]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B stat
|
||||
transaction inquires about the file
|
||||
identified by
|
||||
.IR fid .
|
||||
The reply will contain a
|
||||
machine-independent
|
||||
.I directory
|
||||
.IR entry ,
|
||||
.IR stat ,
|
||||
laid out as follows:
|
||||
.TP
|
||||
.I size\f1[2]\fP
|
||||
total byte count of the following data
|
||||
.TP
|
||||
.I type\f1[2]\fP
|
||||
for kernel use
|
||||
.TP
|
||||
.I dev\f1[4]\fP
|
||||
for kernel use
|
||||
.TP
|
||||
.I qid.type\f1[1]\fP
|
||||
the type of the file (directory, etc.), represented as a bit vector
|
||||
corresponding to the high 8 bits of the file's mode word.
|
||||
.TP
|
||||
.I qid.vers\f1[4]\fP
|
||||
version number for given path
|
||||
.TP
|
||||
.I qid.path\f1[8]\fP
|
||||
the file server's unique identification for the file
|
||||
.TP
|
||||
.I mode\f1[4]\fP
|
||||
permissions and flags
|
||||
.TP
|
||||
.I atime\f1[4]\fP
|
||||
last access time
|
||||
.TP
|
||||
.I mtime\f1[4]\fP
|
||||
last modification time
|
||||
.TP
|
||||
.I length\f1[8]\fP
|
||||
length of file in bytes
|
||||
.TP
|
||||
.I name\f1[ s ]\fP
|
||||
file name; must be
|
||||
.B /
|
||||
if the file is the root directory of the server
|
||||
.TP
|
||||
.I uid\f1[ s ]\fP
|
||||
owner name
|
||||
.TP
|
||||
.I gid\f1[ s ]\fP
|
||||
group name
|
||||
.TP
|
||||
.I muid\f1[ s ]\fP
|
||||
name of the user who last modified the file
|
||||
.PD
|
||||
.PP
|
||||
Integers in this encoding are in little-endian order (least
|
||||
significant byte first).
|
||||
The
|
||||
.I convM2D
|
||||
and
|
||||
.I convD2M
|
||||
routines (see
|
||||
.IR fcall (3))
|
||||
convert between directory entries and a C structure called a
|
||||
.BR Dir .
|
||||
.PP
|
||||
The
|
||||
.I mode
|
||||
contains permission bits as described in
|
||||
.IR intro (9P)
|
||||
and the following:
|
||||
.B 0x80000000
|
||||
.RB ( DMDIR ,
|
||||
this file is a directory),
|
||||
.B 0x40000000
|
||||
.RB ( DMAPPEND ,
|
||||
append only),
|
||||
.B 0x20000000
|
||||
.RB ( DMEXCL ,
|
||||
exclusive use),
|
||||
.B 0x04000000
|
||||
.RB ( DMTMP ,
|
||||
temporary);
|
||||
these are echoed in
|
||||
.BR Qid.type .
|
||||
Writes to append-only files always place their data at the
|
||||
end of the file; the
|
||||
.I offset
|
||||
in the
|
||||
.B write
|
||||
message is ignored, as is the
|
||||
.B OTRUNC
|
||||
bit in an open.
|
||||
Exclusive use files may be open for I/O by only one fid at a time
|
||||
across all clients of the server. If a second open is attempted,
|
||||
it draws an error. Servers may implement a timeout on the lock
|
||||
on an exclusive use file: if the fid holding the file open has
|
||||
been unused for an extended period (of order at least minutes),
|
||||
it is reasonable to break the lock and deny the initial fid
|
||||
further I/O.
|
||||
Temporary files are not included in nightly archives
|
||||
(see Plan 9's \fIfossil\fR(4)).
|
||||
.PP
|
||||
The two time fields are measured in seconds since the epoch
|
||||
(Jan 1 00:00 1970 GMT).
|
||||
The
|
||||
.I mtime
|
||||
field reflects the time of the last change of content (except when later changed by
|
||||
.BR wstat ).
|
||||
For a plain file,
|
||||
.I mtime
|
||||
is the time of the most recent
|
||||
.BR create ,
|
||||
.B open
|
||||
with truncation,
|
||||
or
|
||||
.BR write ;
|
||||
for a directory it is the time of the most recent
|
||||
.BR remove ,
|
||||
.BR create ,
|
||||
or
|
||||
.B wstat
|
||||
of a file in the directory.
|
||||
Similarly, the
|
||||
.I atime
|
||||
field records the last
|
||||
.B read
|
||||
of the contents;
|
||||
also it is set whenever
|
||||
.I mtime
|
||||
is set.
|
||||
In addition, for a directory, it is set by
|
||||
an
|
||||
.BR attach ,
|
||||
.BR walk ,
|
||||
or
|
||||
.BR create ,
|
||||
all whether successful or not.
|
||||
.PP
|
||||
The
|
||||
.I muid
|
||||
field names the user whose actions most recently changed the
|
||||
.I mtime
|
||||
of the file.
|
||||
.PP
|
||||
The
|
||||
.I length
|
||||
records the number of bytes in the file.
|
||||
Directories and most files representing devices have a conventional
|
||||
length of 0.
|
||||
.PP
|
||||
The
|
||||
.B stat
|
||||
request requires no special permissions.
|
||||
.PP
|
||||
The
|
||||
.B wstat
|
||||
request can change some of the file status information.
|
||||
The
|
||||
.I name
|
||||
can be changed by anyone with write permission in the parent directory;
|
||||
it is an error to change the name to that of an existing file.
|
||||
The
|
||||
.I length
|
||||
can be changed (affecting the actual length of the file) by anyone with
|
||||
write permission on the file.
|
||||
It is an error to attempt to set the length of a directory to a non-zero value,
|
||||
and servers may decide to reject length changes for other reasons.
|
||||
The
|
||||
.I mode
|
||||
and
|
||||
.I mtime
|
||||
can be changed by the owner of the file or the group leader of the file's current
|
||||
group.
|
||||
The directory bit cannot be changed by a
|
||||
.BR wstat ;
|
||||
the other defined permission and mode bits can.
|
||||
The
|
||||
.I gid
|
||||
can be changed: by the owner if also a member of the new group; or
|
||||
by the group leader of the file's current group
|
||||
if also leader of the new group
|
||||
(see
|
||||
.IR intro (9P)
|
||||
for more information about permissions, users, and groups).
|
||||
None of the other data can be altered by a
|
||||
.B wstat
|
||||
and attempts to change them will trigger an error.
|
||||
In particular,
|
||||
it is illegal to attempt to change the owner of a file.
|
||||
(These conditions may be
|
||||
relaxed when establishing the initial state of a file server; see
|
||||
Plan 9's \fIfsconfig\fR(8).)
|
||||
.PP
|
||||
Either all the changes in
|
||||
.B wstat
|
||||
request happen, or none of them does: if the request succeeds,
|
||||
all changes were made; if it fails, none were.
|
||||
.PP
|
||||
A
|
||||
.B wstat
|
||||
request can avoid modifying some properties of the file
|
||||
by providing explicit ``don't touch'' values in the
|
||||
.B stat
|
||||
data that is sent: zero-length strings for text values and
|
||||
the maximum unsigned value of appropriate size
|
||||
for integral values.
|
||||
As a special case, if
|
||||
.I all
|
||||
the elements of the directory entry in a
|
||||
.B Twstat
|
||||
message are ``don't touch'' values, the server may interpret it
|
||||
as a request to guarantee that the contents of the associated
|
||||
file are committed to stable storage before the
|
||||
.B Rwstat
|
||||
message is returned.
|
||||
(Consider the message to mean, ``make the state of the file
|
||||
exactly what it claims to be.'')
|
||||
.PP
|
||||
A
|
||||
.I read
|
||||
of a directory yields an integral number of directory entries in
|
||||
the machine independent encoding given above
|
||||
(see
|
||||
.IR read (9P)).
|
||||
.PP
|
||||
Note that since the
|
||||
.B stat
|
||||
information is sent as a 9P variable-length datum, it is limited to a maximum of
|
||||
65535 bytes.
|
||||
.SH ENTRY POINTS
|
||||
.B Stat
|
||||
messages are generated by
|
||||
.I fsdirfstat
|
||||
and
|
||||
.IR fsdirstat
|
||||
(see
|
||||
.IR 9pclient (3)).
|
||||
.PP
|
||||
.B Wstat
|
||||
messages are generated by
|
||||
.I fsdirfwstat
|
||||
and
|
||||
.IR fsdirwstat .
|
||||
.SH BUGS
|
||||
To make the contents of a directory, such as returned by
|
||||
.IR read (9P),
|
||||
easy to parse, each
|
||||
directory entry begins with a size field.
|
||||
For consistency, the entries in
|
||||
.B Twstat
|
||||
and
|
||||
.B Rstat
|
||||
messages also contain
|
||||
their size, which means the size appears twice.
|
||||
For example, the
|
||||
.B Rstat
|
||||
message is formatted as
|
||||
.RI ``(4+1+2+2+ n )[4]
|
||||
.B Rstat
|
||||
.IR tag [2]
|
||||
.IR n [2]
|
||||
.RI ( n -2)[2]
|
||||
.IR type [2]
|
||||
.IR dev [4]...,''
|
||||
where
|
||||
.I n
|
||||
is the value returned by
|
||||
.BR convD2M .
|
||||
99
man/man9/version.9p
Normal file
99
man/man9/version.9p
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
.TH VERSION 9P
|
||||
.SH NAME
|
||||
version \- negotiate protocol version
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTversion 'u
|
||||
.IR size [4]
|
||||
.B Tversion
|
||||
.IR tag [2]
|
||||
.IR msize [4]
|
||||
.IR version [ s ]
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rversion
|
||||
.IR tag [2]
|
||||
.IR msize [4]
|
||||
.IR version [ s ]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B version
|
||||
request negotiates the protocol version and message size
|
||||
to be used on the connection and initializes the connection for I/O.
|
||||
.B Tversion
|
||||
must be the first message sent on the 9P connection,
|
||||
and the client cannot issue any further requests until it has received the
|
||||
.B Rversion
|
||||
reply.
|
||||
The
|
||||
.I tag
|
||||
should be
|
||||
.B NOTAG
|
||||
(value
|
||||
.BR (ushort)~0 )
|
||||
for a
|
||||
.B version
|
||||
message.
|
||||
.PP
|
||||
The client suggests a maximum message size,
|
||||
.BR msize ,
|
||||
that is the maximum length, in bytes,
|
||||
it will ever generate or expect to receive in a single 9P message.
|
||||
This count includes all 9P protocol data, starting from the
|
||||
.B size
|
||||
field and extending through the message,
|
||||
but excludes enveloping transport protocols.
|
||||
The server responds with its own maximum,
|
||||
.BR msize ,
|
||||
which must be less than or equal to the client's value.
|
||||
Thenceforth, both sides of the connection must honor this limit.
|
||||
.PP
|
||||
The
|
||||
.B version
|
||||
string identifies the level of the protocol.
|
||||
The string must always begin with the two characters
|
||||
.RB `` 9P ''.
|
||||
If the server does not understand the client's version string,
|
||||
it should respond with an
|
||||
.B Rversion
|
||||
message (not
|
||||
.BR Rerror )
|
||||
with the
|
||||
.B version
|
||||
string the 7 characters
|
||||
.RB `` unknown ''.
|
||||
.PP
|
||||
The server may respond with the client's version string,
|
||||
or a version string identifying
|
||||
an earlier defined protocol version.
|
||||
Currently, the only defined version is the 6 characters
|
||||
.RB `` 9P2000 ''.
|
||||
Version strings are defined such that, if the client string contains
|
||||
one or more period characters, the initial substring up to but not including
|
||||
any single period in the version string defines a version of the protocol.
|
||||
After stripping any such period-separated suffix, the server is allowed to respond
|
||||
with a string of the form
|
||||
.BI 9P nnnn\f1,
|
||||
where
|
||||
.I nnnn
|
||||
is less than or equal to the digits sent by the client.
|
||||
.PP
|
||||
The client and server will use the protocol version defined by the
|
||||
server's response for all subsequent communication on the connection.
|
||||
.PP
|
||||
A successful
|
||||
.B version
|
||||
request initializes the connection.
|
||||
All outstanding I/O on the connection is aborted; all active fids are freed (`clunked') automatically.
|
||||
The set of messages between
|
||||
.B version
|
||||
requests is called a
|
||||
.IR session .
|
||||
.SH ENTRY POINTS
|
||||
.I Fsversion
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
generates
|
||||
.B version
|
||||
messages;
|
||||
it is called automatically by
|
||||
.IR fsmount .
|
||||
189
man/man9/walk.9p
Normal file
189
man/man9/walk.9p
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
.TH WALK 9P
|
||||
.SH NAME
|
||||
walk \- descend a directory hierarchy
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTwalk 'u
|
||||
.IR size [4]
|
||||
.B Twalk
|
||||
.IR tag [2]
|
||||
.IR fid [4]
|
||||
.IR newfid [4]
|
||||
.IR nwname [2]
|
||||
.IR nwname *( wname [ s ])
|
||||
.br
|
||||
.IR size [4]
|
||||
.B Rwalk
|
||||
.IR tag [2]
|
||||
.IR nwqid [2]
|
||||
.IR nwqid *( qid [13])
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B walk
|
||||
request carries as arguments an existing
|
||||
.IR fid
|
||||
and a proposed
|
||||
.I newfid
|
||||
(which must not be in use unless it is the same as
|
||||
.IR fid )
|
||||
that the client wishes to associate with
|
||||
the result of traversing the directory hierarchy
|
||||
by `walking' the hierarchy using the successive path name
|
||||
elements
|
||||
.BR wname .
|
||||
The
|
||||
.I fid
|
||||
must represent a directory unless zero path name elements are specified.
|
||||
.PP
|
||||
The
|
||||
.I fid
|
||||
must be valid in the current session and must not have been opened for I/O
|
||||
by an
|
||||
.B open
|
||||
or
|
||||
.B create
|
||||
message.
|
||||
If the full sequence of
|
||||
.B nwname
|
||||
elements is walked successfully,
|
||||
.I newfid
|
||||
will represent the file that results.
|
||||
If not,
|
||||
.I newfid
|
||||
(and
|
||||
.BR fid )
|
||||
will be unaffected.
|
||||
However, if
|
||||
.I newfid
|
||||
is in use or otherwise illegal, an
|
||||
.B Rerror
|
||||
is returned.
|
||||
.PP
|
||||
The name
|
||||
.RB `` .. ''
|
||||
(dot-dot) represents the parent directory.
|
||||
The name
|
||||
.RB `` . ''
|
||||
(dot), meaning the current directory, is not used in the protocol.
|
||||
.PP
|
||||
It is legal for
|
||||
.B nwname
|
||||
to be zero, in which case
|
||||
.I newfid
|
||||
will represent the same file as
|
||||
.I fid
|
||||
and the
|
||||
.B walk
|
||||
will usually succeed; this is equivalent to walking to dot.
|
||||
The rest of this discussion assumes
|
||||
.B nwname
|
||||
is greater than zero.
|
||||
.PP
|
||||
The
|
||||
.B nwname
|
||||
path name elements
|
||||
.B wname
|
||||
are walked in order, ``elementwise''.
|
||||
For the first elementwise walk
|
||||
to succeed, the file identified by
|
||||
.I fid
|
||||
must be a directory,
|
||||
and the implied user of the request must have permission
|
||||
to search the directory (see
|
||||
.IR intro (9P)).
|
||||
Subsequent elementwise walks have equivalent restrictions
|
||||
applied to the implicit fid that results from the preceding elementwise walk.
|
||||
.PP
|
||||
If the first element cannot be walked for any reason,
|
||||
.B Rerror
|
||||
is returned.
|
||||
Otherwise, the walk will return an
|
||||
.B Rwalk
|
||||
message containing
|
||||
.I nwqid
|
||||
qids corresponding, in order, to the files that are visited by the
|
||||
.I nwqid
|
||||
successful elementwise walks;
|
||||
.I nwqid
|
||||
is therefore either
|
||||
.B nwname
|
||||
or the index of the first elementwise walk that failed.
|
||||
The value of
|
||||
.I nwqid
|
||||
cannot be zero unless
|
||||
.B nwname
|
||||
is zero.
|
||||
Also,
|
||||
.I nwqid
|
||||
will always be less than or equal to
|
||||
.BR nwname .
|
||||
Only if it is equal, however, will
|
||||
.I newfid
|
||||
be affected, in which case
|
||||
.I newfid
|
||||
will represent the file
|
||||
reached by the final elementwise walk requested in the message.
|
||||
.PP
|
||||
A
|
||||
.B walk
|
||||
of the name
|
||||
.RB `` .. ''
|
||||
in the root directory of a server is equivalent to a walk with no name elements.
|
||||
.PP
|
||||
If
|
||||
.I newfid
|
||||
is the same as
|
||||
.IR fid ,
|
||||
the above discussion applies, with the obvious difference
|
||||
that if the walk changes the state of
|
||||
.IR newfid ,
|
||||
it also changes the state of
|
||||
.IR fid ;
|
||||
and if
|
||||
.I newfid
|
||||
is unaffected, then
|
||||
.I fid
|
||||
is also unaffected.
|
||||
.PP
|
||||
To simplify the implementation of the servers, a maximum of sixteen name elements or qids
|
||||
may be packed in a single message.
|
||||
This constant is called
|
||||
.B MAXWELEM
|
||||
in
|
||||
.IR fcall (3).
|
||||
Despite this restriction, the system imposes no limit on the number of elements in a file name,
|
||||
only the number that may be transmitted in a single message.
|
||||
.SH ENTRY POINTS
|
||||
.I Fswalk
|
||||
(see
|
||||
.IR 9pclient (3))
|
||||
generates walk messages.
|
||||
One or more walk messages may be generated by
|
||||
any call that evaluates file names:
|
||||
.IR fsopen ,
|
||||
.IR fsopenfd ,
|
||||
.IR fsdirstat ,
|
||||
.IR fsdirwstat .
|
||||
.\"
|
||||
.\" A call to
|
||||
.\" .IR chdir (2)
|
||||
.\" causes a
|
||||
.\" .BR walk .
|
||||
.\" One or more
|
||||
.\" .B walk
|
||||
.\" messages may be generated by
|
||||
.\" any of the following calls, which evaluate file names:
|
||||
.\" .IR bind ,
|
||||
.\" .IR create ,
|
||||
.\" .IR exec ,
|
||||
.\" .IR mount ,
|
||||
.\" .IR open ,
|
||||
.\" .IR remove ,
|
||||
.\" .IR stat ,
|
||||
.\" .IR unmount ,
|
||||
.\" .IR wstat .
|
||||
.\" The file name element
|
||||
.\" .B .
|
||||
.\" (dot) is interpreted locally and
|
||||
.\" is not transmitted in
|
||||
.\" .B walk
|
||||
.\" messages.
|
||||
Loading…
Add table
Add a link
Reference in a new issue