term% cat index.txt STAT(2) System Calls Manual STAT(2)
NAME
stat, fstat, wstat, fwstat, dirstat, dirfstat, dirwstat, dirfwstat -
get and put file status
SYNOPSIS
#include <u.h>
#include <libc.h>
int stat(char *name, char *edir)
int fstat(int fd, char *edir)
int wstat(char *name, char *edir)
int fwstat(int fd, char *edir)
int dirstat(char *name, Dir *dir)
int dirfstat(int fd, Dir *dir)
int dirwstat(char *name, Dir *dir)
int dirfwstat(int fd, Dir *dir)
DESCRIPTION
Given a file's name, or an open file descriptor fd, these routines re‐
trieve or modify file status information. Stat, fstat, wstat, and fw‐
stat are the system calls; they deal with machine-independent directory
entries. Their format is defined by stat(5). Stat and fstat retrieve
information about name or fd into edir, a buffer of length DIRLEN, de‐
fined in <libc.h>. Wstat and fwstat write information back, thus
changing file attributes according to edir.
Dirstat, dirfstat, dirwstat, and dirfwstat are the same as their coun‐
terparts, except that they operate on Dir structures:
typedef
struct Dir {
char name[NAMELEN]; /* last element of path */
char uid[NAMELEN]; /* owner name */
char gid[NAMELEN]; /* group name */
Qid qid; /* unique id from server */
long mode; /* permissions */
long atime; /* last read time */
long mtime; /* last write time */
Length; /* file length: see <u.h> */
ushort type; /* server type */
ushort dev; /* server subtype */
} Dir;
This structure, the Qid structure, NAMELEN, and DIRLEN are defined in
<libc.h>. The Length structure is defined in </$objtype/u.h>. Length
is an unnamed structure (see 2c(1)), which means that its fields are
directly accessible; if the length is known to fit in a long, then use
length as a field name to retrieve it. If the file resides on perma‐
nent storage and is not a directory, the length returned by stat is the
number of bytes in the file. For directories, the length returned is
zero. For files that are streams (e.g., pipes and network connec‐
tions), the length is the number of bytes that can be read without
blocking.
Each file is the responsibility of some server: it could be a file
server, a kernel device, or a user process. Type 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 structure containing path and
vers fields, each an unsigned long: 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 type,
dev, and qid they are the same file.
The bits in mode are defined by
0x80000000 directory
0x40000000 append only
0x20000000 exclusive use (locked)
0400 read permission by owner
0200 write permission by owner
0100 execute permission (search on directory) by owner
0070 read, write, execute (search) by group
0007 read, write, execute (search) by others
There are constants defined in <libc.h> for these bits: CHDIR, CHAP‐
PEND, and CHEXCL for the first three; and CHREAD, CHWRITE, and CHEXEC
for the read, write, and execute bits for others.
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 the file. Groups
are also users, but each server is free to associate a list of users
with any user name g, and that list is the set of users in the group g.
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 with the 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. (See intro(5) for permission information, and users(6) for
user and group information).
SOURCE
/sys/src/libc/9syscall
for the non-dir routines
/sys/src/libc/9sys
for the routines prefixed dir
SEE ALSO
intro(2), fcall(2), dirread(2), stat(5)
DIAGNOSTICS
All these functions return 0 on success, -1 on error, and set errstr.
STAT(2)