|  | .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 . |