groff 1.23.0 added .MR to its -man macro package. The NEWS file states
that the inclusion of the macro "was prompted by its introduction to
Plan 9 from User Space's troff in August 2020." From d32deab it seems
that the name for Plan 9 from User Space's implementation was suggested
by groff maintainer G. Brandon Robinson.
Not sure if the intention was to make these definitions compatible, but
it would be nice if they were.
Currently, Plan 9 from User Space's .MR expects its second argument to
be parenthesized. groff's .MR does not. This results in extra
parentheses appearing in manual references when viewing Plan 9 from User
Space's manual pages on a system using groff.
318 lines
6.6 KiB
Groff
318 lines
6.6 KiB
Groff
.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
|
|
.MR 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 0x00800000\fP Unix device file
|
|
\fL 0x02000000\fP symbolic link
|
|
\fL 0x00200000\fP named pipe
|
|
\fL 0x00100000\fP socket
|
|
|
|
\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 \*9/src/lib9/dirstat.c
|
|
.SH SEE ALSO
|
|
.MR intro 3 ,
|
|
.MR fcall 3 ,
|
|
.MR 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
|
|
.MR 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.
|