Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ (2) — Plan9 1st Edition

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

intro(2)

fcall(2)

dirread(2)

stat(5)

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 retrieve or modify file status information. Stat, fstat, wstat, and ­fwstat 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, defined 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 counterparts, except that they operate on ­Dir structures:

typedef
struct Dir {
charname[NAMELEN];/∗ last element of path ∗/
charuid[NAMELEN];/∗ owner name ∗/
chargid[NAMELEN];/∗ group name ∗/
Qidqid;/∗ unique id from server ∗/
longmode;/∗ permissions ∗/
longatime;/∗ last read time ∗/
longmtime;/∗ last write time ∗/
Length;/∗ file length: see <u.h> ∗/
ushorttype;/∗ server type ∗/
ushortdev;/∗ 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 permanent 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 connections), 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

0x80000000directory
0x40000000append only
0x20000000exclusive use (locked)
       0400read permission by owner
      0200write permission by owner
      0100execute permission (search on directory) by owner
      0070read, write, execute (search) by group
      0007read, write, execute (search) by others

There are constants defined in ­<libc.h> for these bits: CHDIR, CHAPPEND, 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.

Plan 9  —  April 04, 1995

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026