Blob


1 .TH 9P-FILE 3
2 .SH NAME
3 Tree, alloctree, freetree,
4 File, createfile, closefile, removefile, walkfile,
5 opendirfile, readdirfile, closedirfile, hasperm \- in-memory file hierarchy
6 .SH SYNOPSIS
7 .ft L
8 .nf
9 #include <u.h>
10 #include <libc.h>
11 #include <fcall.h>
12 #include <thread.h>
13 #include <9p.h>
14 .fi
15 .PP
16 .ft L
17 .nf
18 .ta \w'\fLFile 'u
19 typedef struct File
20 {
21 Ref;
22 Dir;
23 void *aux;
24 \fI...\fP
25 } File;
26 .fi
27 .PP
28 .ft L
29 .nf
30 .ta \w'\fLTree 'u
31 typedef struct Tree
32 {
33 File *root;
34 \fI...\fP
35 } Tree;
36 .fi
37 .PP
38 .ft L
39 .nf
40 .ta \w'\fLReaddir* 'u +4n +4n
41 Tree* alloctree(char *uid, char *gid, ulong mode,
42 void (*destroy)(File*))
43 void freetree(Tree *tree)
44 File* createfile(File *dir, char *name, char *uid,
45 ulong mode, void *aux)
46 int removefile(File *file)
47 void closefile(File *file)
48 File* walkfile(File *dir, char *path)
49 Readdir* opendirfile(File *dir)
50 long readdirfile(Readdir *rdir, char *buf, long n)
51 void closedirfile(Readdir *rdir)
52 int hasperm(File *file, char *uid, int p)
53 .fi
54 .SH DESCRIPTION
55 .BR File s
56 and
57 .BR Tree s
58 provide an in-memory file hierarchy
59 intended for use in 9P file servers.
60 .PP
61 .I Alloctree
62 creates a new tree of files, and
63 .I freetree
64 destroys it.
65 The root of the tree
66 (also the
67 .B root
68 element in the structure)
69 will have mode
70 .I mode
71 and be owned by user
72 .I uid
73 and group
74 .IR gid .
75 .I Destroy
76 is used when freeing
77 .B File
78 structures and is described later.
79 .PP
80 .BR File s
81 (including directories)
82 other than the root are created using
83 .IR createfile ,
84 which attempts to create a file named
85 .I name
86 in the directory
87 .IR dir .
88 If created, the file will have owner
89 .I uid
90 and have a group inherited from
91 the directory.
92 .I Mode
93 and the permissions of
94 .I dir
95 are used to calculate the permission bits for
96 the file as described in
97 .IR open (9p).
98 It is permissible for
99 .I name
100 to be a slash-separated path rather than a single element.
101 .PP
102 .I Removefile
103 removes a file from the file tree.
104 The file will not be freed until the last
105 reference to it has been removed.
106 Directories may only be removed when empty.
107 .I Removefile
108 returns zero on success, \-1 on error.
109 It is correct to consider
110 .I removefile
111 to be
112 .I closefile
113 with the side effect of removing the file
114 when possible.
115 .PP
116 .I Walkfile
117 evaluates
118 .I path
119 relative to the directory
120 .IR dir ,
121 returning the resulting file,
122 or zero if the named file or any intermediate element
123 does not exist.
124 .PP
125 The
126 .B File
127 structure's
128 .B aux
129 pointer may be used by the client
130 for
131 .RB per- File
132 storage.
133 .BR File s
134 are reference-counted: if not zero,
135 .I destroy
136 (specified in the call to
137 .IR alloctree )
138 will be called for each file when its
139 last reference is removed or when the tree is freed.
140 .I Destroy
141 should take care of any necessary cleanup related to
142 .BR aux .
143 When creating new file references by copying pointers,
144 call
145 .I incref
146 (see
147 .MR lock (3) )
148 to update the reference count.
149 To note the removal of a reference to a file, call
150 .IR closefile .
151 .I Createfile
152 and
153 .I walkfile
154 return new references.
155 .IR Removefile ,
156 .IR closefile ,
157 and
158 .I walkfile
159 (but not
160 .IR createfile )
161 consume the passed reference.
162 .PP
163 Directories may be read, yielding a directory entry structure
164 (see
165 .IR stat (9p))
166 for each file in the directory.
167 In order to allow concurrent reading of directories,
168 clients must obtain a
169 .B Readdir
170 structure by calling
171 .I opendirfile
172 on a directory.
173 Subsequent calls to
174 .I readdirfile
175 will each yield an integral number of machine-independent
176 stat buffers, until end of directory.
177 When finished, call
178 .I closedirfile
179 to free the
180 .BR Readdir .
181 .PP
182 .I Hasperm
183 does simplistic permission checking; it assumes only
184 one-user groups named by uid and returns non-zero if
185 .I uid
186 has permission
187 .I p
188 (a bitwise-or of
189 .BR AREAD ,
190 .BR AWRITE
191 and
192 .BR AEXEC )
193 according to
194 .IB file ->mode \fR.
195 9P servers written using
196 .B File
197 trees will do standard permission checks automatically;
198 .I hasperm
199 may be called explicitly to do additional checks.
200 A 9P server may link against a different
201 .I hasperm
202 implementation to provide more complex groups.
203 .SH EXAMPLE
204 The following code correctly handles references
205 when elementwise walking a path and creating a file.
206 .IP
207 .EX
208 f = tree->root;
209 incref(f);
210 for(i=0; i<n && f!=nil; i++)
211 f = walkfile(f, elem[i]);
212 if(f == nil)
213 return nil;
214 nf = createfile(f, "foo", "nls", 0666, nil);
215 closefile(f);
216 return nf;
217 .EE
218 .SH SOURCE
219 .B \*9/src/lib9p/file.c
220 .SH SEE ALSO
221 .MR 9p (3)
222 .SH BUGS
223 The reference counting is cumbersome.