Blob


1 .TH STAT 3
2 .SH NAME
3 stat, fstat, wstat, fwstat, dirstat, dirfstat, dirwstat, dirfwstat, nulldir \- get and put file status
4 .SH SYNOPSIS
5 .B #include <u.h>
6 .br
7 .B #include <libc.h>
8 .PP
9 .B
10 int stat(char *name, uchar *edir, int nedir)
11 .PP
12 .B
13 int fstat(int fd, uchar *edir, int nedir)
14 .PP
15 .B
16 int wstat(char *name, uchar *edir, int nedir)
17 .PP
18 .B
19 int fwstat(int fd, uchar *edir, int nedir)
20 .PP
21 .B
22 Dir* dirstat(char *name)
23 .PP
24 .B
25 Dir* dirfstat(int fd)
26 .PP
27 .B
28 int dirwstat(char *name, Dir *dir)
29 .PP
30 .B
31 int dirfwstat(int fd, Dir *dir)
32 .PP
33 .B
34 void nulldir(Dir *d)
35 .SH DESCRIPTION
36 Given a file's
37 .IR name ,
38 or an open file descriptor
39 .IR fd ,
40 these routines retrieve or modify file status information.
41 .IR Stat ,
42 .IR fstat ,
43 .IR wstat ,
44 and
45 .I fwstat
46 are the system calls; they deal with machine-independent
47 .IR "directory entries" .
48 Their format is defined by
49 .IR stat (9p).
50 .I Stat
51 and
52 .I fstat
53 retrieve information about
54 .I name
55 or
56 .I fd
57 into
58 .IR edir ,
59 a buffer of length
60 .IR nedir ,
61 defined in
62 .BR <libc.h> .
63 .I Wstat
64 and
65 .I fwstat
66 write information back, thus changing file attributes according to the contents of
67 .IR edir .
68 The data returned from the kernel includes its leading 16-bit length field
69 as described in
70 .IR intro (9p).
71 For symmetry, this field must also be present when passing data to the kernel in a call to
72 .I wstat
73 and
74 .IR fwstat ,
75 but its value is ignored.
76 .PP
77 .IR Dirstat ,
78 .IR dirfstat ,
79 .IR dirwstat ,
80 and
81 .I dirfwstat
82 are similar to their counterparts, except that they
83 operate on
84 .I Dir
85 structures:
86 .IP
87 .EX
88 .ta 6n +\w'ulong 'u +\w'mtime; 'u
89 typedef
90 struct Dir {
91 /* system-modified data */
92 uint type; /* server type */
93 uint dev; /* server subtype */
94 /* file data */
95 Qid qid; /* unique id from server */
96 ulong mode; /* permissions */
97 ulong atime; /* last read time */
98 ulong mtime; /* last write time */
99 vlong length; /* file length: see <u.h> */
100 char *name; /* last element of path */
101 char *uid; /* owner name */
102 char *gid; /* group name */
103 char *muid; /* last modifier name */
104 } Dir;
105 .EE
106 .PP
107 The returned structure is allocated by
108 .IR malloc (3);
109 freeing it also frees the associated strings.
110 .PP
111 This structure and
112 the
113 .B Qid
114 structure
115 are defined in
116 .BR <libc.h> .
117 If the file resides on permanent storage and is not a directory,
118 the length returned by
119 .I stat
120 is the number of bytes in the file.
121 For directories, the length returned is zero.
122 For files that are streams (e.g., pipes and network connections),
123 the length is the number of bytes that can be read without blocking.
124 .PP
125 Each file is the responsibility of some
126 .IR server :
127 it could be a file server, a kernel device, or a user process.
128 .B Type
129 identifies the server type, and
130 .B dev
131 says which of a group of servers of the same type is the one
132 responsible for this file.
133 .B Qid
134 is a structure containing
135 .B path
136 and
137 .B vers
138 fields:
139 .B path
140 is guaranteed to be
141 unique among all path names currently on the file server, and
142 .B vers
143 changes each time the file is modified.
144 The
145 .B path
146 is a
147 .B long
148 .B long
149 (64 bits,
150 .BR vlong )
151 and the
152 .B vers
153 is an
154 .B unsigned long
155 (32 bits,
156 .BR ulong ).
157 Thus, if two files have the same
158 .BR type ,
159 .BR dev ,
160 and
161 .B qid
162 they are the same file.
163 .PP
164 The bits in
165 .B mode
166 are defined by
167 .PP
168 .ta 6n +\w'\fL0x80000000 'u
169 .nf
170 \fL 0x80000000\fP directory
171 \fL 0x40000000\fP append only
172 \fL 0x20000000\fP exclusive use (locked)
174 \fL 0400\fP read permission by owner
175 \fL 0200\fP write permission by owner
176 \fL 0100\fP execute permission (search on directory) by owner
177 \fL 0070\fP read, write, execute (search) by group
178 \fL 0007\fP read, write, execute (search) by others
179 .fi
180 .PP
181 There are constants defined in
182 .B <libc.h>
183 for these bits:
184 .BR DMDIR ,
185 .BR DMAPPEND ,
186 and
187 .B DMEXCL
188 for the first three; and
189 .BR DMREAD ,
190 .BR DMWRITE ,
191 and
192 .B DMEXEC
193 for the read, write, and execute bits for others.
194 .PP
195 The two time fields are measured in seconds since the epoch
196 (Jan 1 00:00 1970 GMT).
197 .B Mtime
198 is the time of the last change of content.
199 Similarly,
200 .B atime
201 is set whenever the contents are accessed;
202 also, it is set whenever
203 .B mtime
204 is set.
205 .PP
206 .B Uid
207 and
208 .B gid
209 are the names of the owner and group of the file;
210 .B muid
211 is the name of the user that last modified the file (setting
212 .BR mtime ).
213 Groups are also users, but each server is free to associate
214 a list of users with any user name
215 .IR g ,
216 and that list is the
217 set of users in the group
218 .IR g .
219 When an initial attachment is made to a server,
220 the user string in the process group is communicated to the server.
221 Thus, the server knows, for any given file access, whether the accessing
222 process is the owner of, or in the group of, the file.
223 This selects which sets of three bits in
224 .B mode
225 is used to check permissions.
226 .PP
227 Only some of the fields may be changed with the
228 .I wstat
229 calls.
230 The
231 .B name
232 can be changed by anyone with write permission in the parent directory.
233 The
234 .B mode
235 and
236 .B mtime
237 can be changed by the owner or the group leader of the file's current
238 group.
239 The
240 .I gid
241 can be changed: by the owner if also a member of the new group; or
242 by the group leader of the file's current group
243 if also leader of the new group
244 (see
245 .IR intro (9p)
246 for more information about permissions, users, and groups).
247 The
248 .B length
249 can be changed by anyone with write permission, provided the operation
250 is implemented by the server.
251 (See
252 .IR intro (9p)
253 for permission, user, and group information).
254 .PP
255 Special values in the fields of the
256 .B Dir
257 passed to
258 .I wstat
259 indicate that the field is not intended to be changed by the call.
260 The values are the maximum unsigned integer of appropriate size
261 for integral values (usually
262 .BR ~0 ,
263 but beware of conversions and size mismatches
264 when comparing values) and the empty or nil string for string values.
265 The routine
266 .I nulldir
267 initializes all the elements of
268 .I d
269 to these ``don't care'' values.
270 Thus one may change the mode, for example, by using
271 .I nulldir
272 to initialize a
273 .BR Dir ,
274 then setting the mode, and then doing
275 .IR wstat ;
276 it is not necessary to use
277 .I stat
278 to retrieve the initial values first.
279 .SH SOURCE
280 .B \*9/src/lib9/dirstat.c
281 .SH SEE ALSO
282 .IR intro (3),
283 .IR fcall (3),
284 .IR dirread (3),
285 .IR stat (9p)
286 .SH DIAGNOSTICS
287 The
288 .I dir
289 functions return a pointer to the data for a successful call, or
290 .B nil
291 on error.
292 The others
293 return the number of bytes copied on success, or \-1 on error.
294 All set
295 .IR errstr .
296 .PP
297 If the buffer for
298 .I stat
299 or
300 .I fstat
301 is too short for the returned data, the return value will be
302 .B BIT16SZ
303 (see
304 .IR fcall (3))
305 and the two bytes
306 returned will contain the initial count field of the
307 returned data;
308 retrying with
309 .B nedir
310 equal to
311 that value plus
312 .B BIT16SZ
313 (for the count itself) should succeed.