.TH STAT 3
.SH NAME
stat, fstat, wstat, fwstat, dirstat, dirfstat, dirwstat, dirfwstat, nulldir \- get and put file status
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.PP
.B
int stat(char *name, uchar *edir, int nedir)
.PP
.B
int fstat(int fd, uchar *edir, int nedir)
.PP
.B
int wstat(char *name, uchar *edir, int nedir)
.PP
.B
int fwstat(int fd, uchar *edir, int nedir)
.PP
.B
Dir* dirstat(char *name)
.PP
.B
Dir* dirfstat(int fd)
.PP
.B
int dirwstat(char *name, Dir *dir)
.PP
.B
int dirfwstat(int fd, Dir *dir)
.PP
.B
void nulldir(Dir *d)
.SH DESCRIPTION
Given a file's
.IR name ,
or an open file descriptor
.IR fd ,
these routines retrieve or modify file status information.
.IR Stat ,
.IR fstat ,
.IR wstat ,
and
.I fwstat
are the system calls; they deal with machine-independent
.IR "directory entries" .
Their format is defined by
.IR stat (9p).
.I Stat
and
.I fstat
retrieve information about
.I name
or
.I fd
into
.IR edir ,
a buffer of length
.IR nedir ,
defined in
.BR <libc.h> .
.I Wstat
and
.I fwstat
write information back, thus changing file attributes according to the contents of
.IR edir .
The data returned from the kernel includes its leading 16-bit length field
as described in
.IR intro (9p).
For symmetry, this field must also be present when passing data to the kernel in a call to
.I wstat
and
.IR fwstat ,
but its value is ignored.
.PP
.IR Dirstat ,
.IR dirfstat ,
.IR dirwstat ,
and
.I dirfwstat
are similar to their counterparts, except that they
operate on
.I Dir
structures:
.IP
.EX
.ta 6n +\w'ulong 'u +\w'mtime;   'u
typedef
struct Dir {
	/* system-modified data */
	uint	type;	/* server type */
	uint	dev;	/* server subtype */
	/* file data */
	Qid	qid;	/* unique id from server */
	ulong	mode;	/* permissions */
	ulong	atime;	/* last read time */
	ulong	mtime;	/* last write time */
	vlong	length;		/* file length: see <u.h> */
	char	*name;	/* last element of path */
	char	*uid;	/* owner name */
	char	*gid;	/* group name */
	char	*muid;	/* last modifier name */
} Dir;
.EE
.PP
The returned structure is allocated by
.IR malloc (3);
freeing it also frees the associated strings.
.PP
This structure and
the
.B Qid
structure
are defined in
.BR <libc.h> .
If the file resides on permanent storage and is not a directory,
the length returned by
.I 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 connections),
the length is the number of bytes that can be read without blocking.
.PP
Each file is the responsibility of some
.IR server :
it could be a file server, a kernel device, or a user process.
.B Type
identifies the server type, and
.B dev
says which of a group of servers of the same type is the one
responsible for this file.
.B Qid
is a structure containing
.B path
and
.B vers
fields:
.B path
is guaranteed to be
unique among all path names currently on the file server, and
.B vers
changes each time the file is modified.
The
.B path
is a
.B long
.B long
(64 bits,
.BR vlong )
and the
.B vers
is an
.B unsigned long
(32 bits,
.BR ulong ).
Thus, if two files have the same
.BR type ,
.BR dev ,
and
.B qid
they are the same file.
.PP
The bits in
.B mode
are defined by
.PP
.ta 6n +\w'\fL0x80000000   'u
.nf
\fL	0x80000000\fP	directory
\fL	0x40000000\fP	append only
\fL	0x20000000\fP	exclusive use (locked)

\fL	      0400\fP	read permission by owner
\fL	      0200\fP	write permission by owner
\fL	      0100\fP	execute permission (search on directory) by owner
\fL	      0070\fP	read, write, execute (search) by group
\fL	      0007\fP	read, write, execute (search) by others
.fi
.PP
There are constants defined in
.B <libc.h>
for these bits:
.BR DMDIR ,
.BR DMAPPEND ,
and
.B DMEXCL
for the first three; and
.BR DMREAD ,
.BR DMWRITE ,
and
.B DMEXEC
for the read, write, and execute bits for others.
.PP
The two time fields are measured in seconds since the epoch
(Jan 1 00:00 1970 GMT).
.B Mtime
is the time of the last change of content.
Similarly,
.B atime
is set whenever the contents are accessed;
also, it is set whenever
.B mtime
is set.
.PP
.B Uid
and
.B gid
are the names of the owner and group of the file;
.B muid
is the name of the user that last modified the file (setting
.BR mtime ).
Groups are also users, but each server is free to associate
a list of users with any user name
.IR g ,
and that list is the
set of users in the group
.IR 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
.B mode
is used to check permissions.
.PP
Only some of the fields may be changed with the
.I wstat
calls.
The
.B name
can be changed by anyone with write permission in the parent directory.
The
.B mode
and
.B mtime
can be changed by the owner or the group leader of the file's current
group.
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).
The
.B length
can be changed by anyone with write permission, provided the operation
is implemented by the server.
(See
.IR intro (9p)
for permission, user, and group information).
.PP
Special values in the fields of the
.B Dir
passed to
.I wstat
indicate that the field is not intended to be changed by the call.
The values are the maximum unsigned integer of appropriate size
for integral values (usually
.BR ~0 ,
but beware of conversions and size mismatches
when comparing values) and the empty or nil string for string values.
The routine
.I nulldir
initializes all the elements of
.I d
to these ``don't care'' values.
Thus one may change the mode, for example, by using
.I nulldir
to initialize a
.BR Dir ,
then setting the mode, and then doing
.IR wstat ;
it is not necessary to use
.I stat
to retrieve the initial values first.
.SH SOURCE
.B /usr/local/plan9/src/lib9/dirstat.c
.SH SEE ALSO
.IR intro (3),
.IR fcall (3),
.IR dirread (3),
.IR stat (9p)
.SH DIAGNOSTICS
The
.I dir
functions return a pointer to the data for a successful call, or
.B nil
on error.
The others
return the number of bytes copied on success, or \-1 on error.
All set
.IR errstr .
.PP
If the buffer for
.I stat
or
.I fstat
is too short for the returned data, the return value will be
.B BIT16SZ
(see
.IR fcall (3))
and the two bytes
returned will contain the initial count field of the
returned data;
retrying with
.B nedir
equal to
that value plus
.B BIT16SZ
(for the count itself) should succeed.
