| tstat.3 - plan9port - [fork] Plan 9 from user space | |
| git clone git://src.adamsgaard.dk/plan9port | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| tstat.3 (6810B) | |
| --- | |
| 1 .TH STAT 3 | |
| 2 .SH NAME | |
| 3 stat, fstat, wstat, fwstat, dirstat, dirfstat, dirwstat, dirfwstat, null… | |
| 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 c… | |
| 67 .IR edir . | |
| 68 The data returned from the kernel includes its leading 16-bit length fie… | |
| 69 as described in | |
| 70 .IR intro (9p). | |
| 71 For symmetry, this field must also be present when passing data to the k… | |
| 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 .MR 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) | |
| 173 \fL 0x00800000\fP Unix device file | |
| 174 \fL 0x02000000\fP symbolic link | |
| 175 \fL 0x00200000\fP named pipe | |
| 176 \fL 0x00100000\fP socket | |
| 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)… | |
| 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 | |
| 249 .IR intro (9p) | |
| 250 for more information about permissions, users, and groups). | |
| 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 | |
| 256 .IR intro (9p) | |
| 257 for permission, user, and group information). | |
| 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 | |
| 284 .B \*9/src/lib9/dirstat.c | |
| 285 .SH SEE ALSO | |
| 286 .MR intro (3) , | |
| 287 .MR fcall (3) , | |
| 288 .MR dirread (3) , | |
| 289 .IR stat (9p) | |
| 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 | |
| 308 .MR fcall (3) ) | |
| 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. |