stat 6.7 KB

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