SYS-STAT(2) SYS-STAT(2) NAME fstat, fwstat, stat, wstat - get and put file status SYNOPSIS include "sys.m"; sys := load Sys Sys->PATH; fstat: fn(fd: ref FD): (int, Dir); fwstat: fn(fd: ref FD; d: Dir): int; stat: fn(name: string): (int, Dir); wstat: fn(name: string, d: Dir): int; DESCRIPTION Given a file's name, or an open file descriptor fd, these routines retrieve or modify file status information. Stat and fstat retrieve information about name or fd into the Dir member of the return tuple. The int member will be zero for success and -1 for failure. wstat and fwstat write informa- tion back, thus changing file attributes according to d. Both functions return zero for success and -1 for failure. File status is recorded as a Dir type: Qid: adt { path: int; vers: int; }; Dir: adt { name: string; uid: string; gid: string; qid: Qid; mode: int; atime: int; mtime: int; length: int; dtype: int; dev: int; }; If the file resides on permanent storage and is not a direc- tory, the length returned by stat is the number of bytes in the file. For directories, the length returned is zero. Some devices report a length that is the number of bytes that may be read from the device without blocking. Page 1 Plan 9 (printed 12/21/24) SYS-STAT(2) SYS-STAT(2) Each file is the responsibility of some server: it could be a file server, a kernel device, or a user process. Dtype identifies the server type, and dev says which of a group of servers of the same type is the one responsible for this file. Qid is a type containing path and vers members, each an integer: path is guaranteed to be unique among all path names currently on the file server, and vers changes each time the file is modified. Thus, if two files have the same dtype, dev, and qid, they are the same file. The bits in mode are defined by 16r80000000 #directory (Sys->CHDIR) 8r400 #read permission by owner 8r200 #write permission by owner 8r100 #execute permission (search on directory) by owner 8r070 #read, write, execute (search) by group 8r007 #read, write, execute (search) by others There is a Sys constant defined for the directory bit: Sys->CHDIR. The two time fields are measured in seconds since the epoch (Jan 1 00:00 1970 GMT). Mtime is the time of the last change of content. Similarly, atime is set whenever the contents are accessed; also, it is set whenever mtime is set. Uid and gid are the names of the owner and group (of owners) of the file. When an initial attachment is made to a server, the user string in the process group is communicated to the server. Thus, the server knows, for any given file access, whether the accessing process is the owner of, or in the group of, the file. This selects which sets of three bits in mode is used to check permissions. Only some of the fields may be changed by wstat calls. The name can be changed by anyone with write permission in the parent directory. The mode and mtime can be changed by the owner or the group leader of the file's current group. The gid can be changed by the owner if he or she is a member of the new group. The gid can be changed by the group leader of the file's current group if he or she is the leader of the new group. FAT file system (Windows9x and Windows/NT) The values of uid and gid are Everyone. Files and directories always have read and execute permis- sion, which cannot be changed. Files without write permis- sion cannot be removed. Page 2 Plan 9 (printed 12/21/24) SYS-STAT(2) SYS-STAT(2) NTFS file system (Windows/NT) Permissions for read, write and execute operates as described in the main section above. Emu(1) attempts to maintain a limited but consistent map between Inferno and NT worlds, specifically between Inferno names and NT security IDs. Special NT group Everyone repre- sents `other' for file permissions. The Inferno uid is the file owner under NT; the Inferno gid reported is the first user in the file's ACL that is neither the owner nor Everyone; failing that, the gid is the file's owner. SEE ALSO sys-intro(2), sys-dirread(2), sys-open(2) Page 3 Plan 9 (printed 12/21/24)