rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 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 |
rsc | 058b011 | 2005-01-03 06:40:20 +0000 | [diff] [blame] | 49 | .IR stat (9p). |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 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 |
rsc | 058b011 | 2005-01-03 06:40:20 +0000 | [diff] [blame] | 70 | .IR intro (9p). |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 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 |
rsc | bf8a59f | 2004-04-11 03:42:27 +0000 | [diff] [blame] | 108 | .IR malloc (3); |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 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) |
rsc | 17ddbe1 | 2005-02-08 20:18:34 +0000 | [diff] [blame] | 173 | \fL 0x00800000\fP Unix device file |
| 174 | \fL 0x00400000\fP symbolic link |
| 175 | \fL 0x00200000\fP named pipe |
| 176 | \fL 0x00100000\fP socket |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 177 | |
| 178 | \fL 0400\fP read permission by owner |
| 179 | \fL 0200\fP write permission by owner |
| 180 | \fL 0100\fP execute permission (search on directory) by owner |
| 181 | \fL 0070\fP read, write, execute (search) by group |
| 182 | \fL 0007\fP read, write, execute (search) by others |
| 183 | .fi |
| 184 | .PP |
| 185 | There are constants defined in |
| 186 | .B <libc.h> |
| 187 | for these bits: |
| 188 | .BR DMDIR , |
| 189 | .BR DMAPPEND , |
| 190 | and |
| 191 | .B DMEXCL |
| 192 | for the first three; and |
| 193 | .BR DMREAD , |
| 194 | .BR DMWRITE , |
| 195 | and |
| 196 | .B DMEXEC |
| 197 | for the read, write, and execute bits for others. |
| 198 | .PP |
| 199 | The two time fields are measured in seconds since the epoch |
| 200 | (Jan 1 00:00 1970 GMT). |
| 201 | .B Mtime |
| 202 | is the time of the last change of content. |
| 203 | Similarly, |
| 204 | .B atime |
| 205 | is set whenever the contents are accessed; |
| 206 | also, it is set whenever |
| 207 | .B mtime |
| 208 | is set. |
| 209 | .PP |
| 210 | .B Uid |
| 211 | and |
| 212 | .B gid |
| 213 | are the names of the owner and group of the file; |
| 214 | .B muid |
| 215 | is the name of the user that last modified the file (setting |
| 216 | .BR mtime ). |
| 217 | Groups are also users, but each server is free to associate |
| 218 | a list of users with any user name |
| 219 | .IR g , |
| 220 | and that list is the |
| 221 | set of users in the group |
| 222 | .IR g . |
| 223 | When an initial attachment is made to a server, |
| 224 | the user string in the process group is communicated to the server. |
| 225 | Thus, the server knows, for any given file access, whether the accessing |
| 226 | process is the owner of, or in the group of, the file. |
| 227 | This selects which sets of three bits in |
| 228 | .B mode |
| 229 | is used to check permissions. |
| 230 | .PP |
| 231 | Only some of the fields may be changed with the |
| 232 | .I wstat |
| 233 | calls. |
| 234 | The |
| 235 | .B name |
| 236 | can be changed by anyone with write permission in the parent directory. |
| 237 | The |
| 238 | .B mode |
| 239 | and |
| 240 | .B mtime |
| 241 | can be changed by the owner or the group leader of the file's current |
| 242 | group. |
| 243 | The |
| 244 | .I gid |
| 245 | can be changed: by the owner if also a member of the new group; or |
| 246 | by the group leader of the file's current group |
| 247 | if also leader of the new group |
| 248 | (see |
rsc | 058b011 | 2005-01-03 06:40:20 +0000 | [diff] [blame] | 249 | .IR intro (9p) |
| 250 | for more information about permissions, users, and groups). |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 251 | The |
| 252 | .B length |
| 253 | can be changed by anyone with write permission, provided the operation |
| 254 | is implemented by the server. |
| 255 | (See |
rsc | 058b011 | 2005-01-03 06:40:20 +0000 | [diff] [blame] | 256 | .IR intro (9p) |
| 257 | for permission, user, and group information). |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 258 | .PP |
| 259 | Special values in the fields of the |
| 260 | .B Dir |
| 261 | passed to |
| 262 | .I wstat |
| 263 | indicate that the field is not intended to be changed by the call. |
| 264 | The values are the maximum unsigned integer of appropriate size |
| 265 | for integral values (usually |
| 266 | .BR ~0 , |
| 267 | but beware of conversions and size mismatches |
| 268 | when comparing values) and the empty or nil string for string values. |
| 269 | The routine |
| 270 | .I nulldir |
| 271 | initializes all the elements of |
| 272 | .I d |
| 273 | to these ``don't care'' values. |
| 274 | Thus one may change the mode, for example, by using |
| 275 | .I nulldir |
| 276 | to initialize a |
| 277 | .BR Dir , |
| 278 | then setting the mode, and then doing |
| 279 | .IR wstat ; |
| 280 | it is not necessary to use |
| 281 | .I stat |
| 282 | to retrieve the initial values first. |
| 283 | .SH SOURCE |
rsc | c3674de | 2005-01-11 17:37:33 +0000 | [diff] [blame] | 284 | .B \*9/src/lib9/dirstat.c |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 285 | .SH SEE ALSO |
rsc | bf8a59f | 2004-04-11 03:42:27 +0000 | [diff] [blame] | 286 | .IR intro (3), |
| 287 | .IR fcall (3), |
| 288 | .IR dirread (3), |
rsc | 058b011 | 2005-01-03 06:40:20 +0000 | [diff] [blame] | 289 | .IR stat (9p) |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 290 | .SH DIAGNOSTICS |
| 291 | The |
| 292 | .I dir |
| 293 | functions return a pointer to the data for a successful call, or |
| 294 | .B nil |
| 295 | on error. |
| 296 | The others |
| 297 | return the number of bytes copied on success, or \-1 on error. |
| 298 | All set |
| 299 | .IR errstr . |
| 300 | .PP |
| 301 | If the buffer for |
| 302 | .I stat |
| 303 | or |
| 304 | .I fstat |
| 305 | is too short for the returned data, the return value will be |
| 306 | .B BIT16SZ |
| 307 | (see |
rsc | bf8a59f | 2004-04-11 03:42:27 +0000 | [diff] [blame] | 308 | .IR fcall (3)) |
rsc | cfa37a7 | 2004-04-10 18:53:55 +0000 | [diff] [blame] | 309 | and the two bytes |
| 310 | returned will contain the initial count field of the |
| 311 | returned data; |
| 312 | retrying with |
| 313 | .B nedir |
| 314 | equal to |
| 315 | that value plus |
| 316 | .B BIT16SZ |
| 317 | (for the count itself) should succeed. |