Blob


1 .TH 9PCLIENT 3
2 .SH NAME
3 CFid, CFsys, fsinit, fsmount, fsroot, fssetroot, fsunmount, nsinit, nsmount, fsversion, fsauth, fsattach, fsclose, fscreate, fsfcreate, fsremove, fsfremove, fsaccess, fsdirread, fsdirreadall, fsdirstat, fsdirfstat, fsdirwstat, fsdirfwstat, fsopen, fsfopen, nsopen, fsopenfd, fspread, fspwrite, fsread, fsreadn, fsseek, fswrite, fsprint, fsvprint \- 9P client library
4 .SH SYNOPSIS
5 .B #include <u.h>
6 .PP
7 .B #include <libc.h>
8 .PP
9 .B #include <fcall.h>
10 .PP
11 .B #include <thread.h>
12 .PP
13 .B #include <9pclient.h>
14 .ta +\w'\fLCFsys* 'u
15 .PP
16 .B
17 CFsys* fsmount(int fd, char *aname)
18 .PP
19 .B
20 CFsys* nsmount(char *name, char *aname)
21 .PP
22 .B
23 CFid* fsroot(CFsys *fsys)
24 .PP
25 .B
26 void fsunmount(CFsys *fsys)
27 .PP
28 .B
29 CFsys* fsinit(int fd)
30 .PP
31 .B
32 CFsys* nsinit(char *name)
33 .PP
34 .B
35 int fsversion(CFsys *fsys, int msize, char *version, int nversion)
36 .PP
37 .B
38 CFid* fsauth(CFsys *fsys, char *uname, char *aname)
39 .PP
40 .B
41 CFid* fsattach(CFsys *fsys, CFid *afid, char *uname, char *aname)
42 .PP
43 .B
44 void fssetroot(CFsys *fsys, CFid *fid)
45 .PP
46 .B
47 void fsclose(CFid *fid)
48 .PP
49 .B
50 CFid* fscreate(CFsys *fs, char *path, int mode, ulong perm)
51 .PP
52 .B
53 int fsfcreate(CFid *fid, char *path, int mode, ulong perm)
54 .PP
55 .B
56 int fsremove(CFSys *fs, char *path)
57 .PP
58 .B
59 int fsfremove(CFid *fid)
60 .PP
61 .B
62 int fsaccess(CFsys *fs, char *path, int amode)
63 .PP
64 .B
65 CFid* fsopen(CFsys *fs, char *path, int mode)
66 .PP
67 .B
68 int fsfopen(CFid *fid, char *path, int mode)
69 .PP
70 .B
71 long fspread(CFid *fid, void *buf, long n, vlong offset)
72 .PP
73 .B
74 long fspwrite(CFid *fid, void *buf, long n, vlong offset)
75 .PP
76 .B
77 long fsread(CFid *fid, void *buf, long n)
78 .PP
79 .B
80 long fsreadn(CFid *fid, void *buf, long n)
81 .PP
82 .B
83 long fswrite(CFid *fid, void *buf, long n)
84 .PP
85 .B
86 int fsprint(CFid *fid, char *fmt, ...)
87 .PP
88 .B
89 int fsvprint(CFid *fid, char *fmt, ...)
90 .PP
91 .B
92 vlong fsseek(CFid *Fid, vlong n, int type)
93 .PP
94 .B
95 Qid fsqid(CFid *fid)
96 .PP
97 .B
98 long fsdirread(CFid *fid, Dir **d)
99 .PP
100 .B
101 long fsdirreadall(CFid *fid, Dir **d)
102 .PP
103 .B
104 Dir* fsdirstat(CFsys *fs, char *path)
105 .PP
106 .B
107 Dir* fsdirfstat(CFid *fid)
108 .PP
109 .B
110 int fsdirwstat(CFsys *fs, char *path, Dir *d)
111 .PP
112 .B
113 int fsdirfwstat(CFid *fid, Dir *d)
114 .PP
115 .B
116 int fsopenfd(CFsys *fs, char *path, int mode)
117 .PP
118 .B
119 CFsys* nsopen(char *name, char *aname, char *path, int mode)
120 .PP
121 .B
122 extern int chatty9pclient;
123 .PP
124 .B
125 extern int eofkill9pclient;
126 .SH DESCRIPTION
127 The
128 .I 9pclient
129 library helps client programs interact with 9P servers.
130 .PP
132 .B CFsys*
133 represents a connection to a 9P server.
135 .B CFid*
136 represents an active fid on some connection;
137 see
138 .IR intro (9p).
139 .PP
140 A new connection to a 9P server is typically established by
141 .I fsmount
142 or
143 .IR nsmount .
144 .I Fsmount
145 initializes a new 9P conversation on the open file descriptor
146 .IR fd ;
147 .I nsmount
148 connects to a service named
149 .I name
150 in the current name space directory
151 (see
152 .MR intro (4) ).
153 Both attach to the root of the file system
154 using the attach name
155 .IR aname .
156 .I Fsroot
157 returns the
158 .B CFid*
159 corresponding to this root.
160 .PP
161 .IR Fsinit ,
162 .IR nsinit ,
163 .IR fsversion ,
164 .IR fsauth ,
165 .IR fsattach ,
166 and
167 .I fssetroot
168 provide more detailed control over the file system connection
169 than
170 .I fsmount
171 and
172 .IR nsmount .
173 .I Fsinit
174 allocates a new
175 .B CFsys*
176 corresponding to a 9P conversation on the file descriptor
177 .I fd
178 and then calls
179 .IR fsversion
180 to initialize the connection.
181 .I Nsinit
182 does the same for name space services.
183 .I Fsversion
184 executes a
185 .IR version (9p)
186 transaction to establish
187 maximum message size and 9P version.
188 .I Fsauth
189 executes an
190 .IR auth (9p)
191 transaction, returning the new auth fid.
192 .RI ( Fsread
193 and
194 .I fswrite
195 can then be used to run the authentication protocol over the fid.)
196 .I Fsattach
197 executes an
198 .IR attach (9p)
199 transaction to connect to the root of a file tree served by the server.
200 It presents
201 .I afid
202 (which may be nil)
203 to establish identity.
204 .I Fssetroot
205 sets the root fid used by
206 .IR fsopen ,
207 .IR fsopenfd ,
208 .IR fsdirstat ,
209 and
210 .IR fsdirwstat ,
211 which evaluate rooted path names.
212 .PP
213 When a fid
214 is no longer needed, it should be clunked by calling
215 .I fsclose
216 and then considered freed.
217 Similarly, when the connection to the server is no longer needed,
218 it should be closed by calling
219 .IR fsunmount ,
220 which will take care of calling
221 .I fsclose
222 on the current root fid.
223 Once all fids have been clunked
224 .I and
225 the connection has been closed
226 (the order is not important),
227 the allocated structures will be freed and the
228 file descriptor corresponding to the connection
229 will be closed
230 (see
231 .MR close (2) ).
232 Fids are not reference counted: when
233 .I fsclose
234 is called, the clunk transaction and freeing of storage
235 happen immediately.
236 Despite its name,
237 .I fsclose
238 can be used to clunk fids that are not open for I/O.
239 .PP
240 .I Fscreate
241 and
242 .I fsopen
243 establish new fids using the
244 .IR walk ,
245 .I create
246 and
247 .I open
248 transactions
249 (see
250 .IR walk (9p)
251 and
252 .IR open (9p)).
253 The
254 .I path
255 argument is evaluated relative to the
256 .B CFsys
257 root
258 (see
259 .I fsroot
260 and
261 .I fssetroot
262 above).
263 The path is parsed as a slash-separated sequence of path elements,
264 as on Unix and Plan 9.
265 Elements that are empty or
266 dot
267 .RB ( . )
268 are ignored.
269 .PP
270 Alternately,
271 .I fswalk
272 walks from a fid to a given name
273 to create a new fid.
274 The name may be nil, corresponding to a walk with no names.
275 Otherwise the name is taken as a slash-separated sequence
276 of path elements.
277 .I Fsfcreate
278 and
279 .I fsfopen
280 issue
281 .I create
282 and
283 .I open
284 transactions using the passed fid argument,
285 which should have been obtained by calling
286 .IR fswalk .
287 .PP
288 Once opened, fids can be read and written using
289 .I fspread
290 and
291 .IR fspwrite ,
292 which execute
293 .I read
294 and
295 .I write
296 transactions
297 (see
298 .IR read (9p)).
299 The library maintains an offset for each fid,
300 analagous to the offset maintained by the kernel for each open file descriptor.
301 .I Fsread
302 and
303 .I fswrite
304 read and write from this offset, and update it after successful calls.
305 .I Fsseek
306 sets the offset; the
307 .I n
308 and
309 .I type
310 arguments are used as in
311 .MR seek (3) .
312 Calling
313 .I fspread
314 or
315 .I fspwrite
316 with an
317 .I offset
318 of \-1
319 is identical to calling
320 .I fsread
321 or
322 .IR fswrite .
323 .I Fsreadn
324 calls
325 .I fsread
326 repeatedly to obtain exactly
327 .I n
328 bytes of data, unless it encounters end-of-file or an error.
329 .PP
330 .IR Attach ,
331 .IR walk ,
332 .IR create ,
333 and
334 .I open
335 transactions include in their replies an updated qid for the
336 fid being manipulated.
337 .I Fsqid
338 returns the most recent qid returned by one of these transactions
339 for the given fid.
340 .PP
341 .I Fsaccess
342 behaves like Unix's
343 .MR access (2) .
344 .I Fsremove
345 removes the named path.
346 .I Fsfremove
347 removes the path corresponding to an open
348 .BR CFid* .
349 .PP
350 Reading an open a directory returns directory entries encoded as described in
351 .IR stat (9p).
352 .PP
353 .I Fsprint
354 and
355 .I fsvprint
356 are like
357 .I fprint
358 and
359 .I vfprint
360 (see
361 .MR print (3) )
362 but write to
363 .BR CFid* s.
364 .PP
365 .I Fsdirread
366 calls
367 .I fsread
368 and then parses the encoded entries into an array of
369 .B Dir*
370 data structures,
371 storing a pointer to the array in
372 .BI *d
373 and returning the number of entries.
374 .I Fsdirreadall
375 is similar but reads the entire directory.
376 The returned pointer should be freed with
377 .I free
378 (see
379 .MR malloc (3) )
380 when no longer needed.
381 .PP
382 .I Fsdirfstat
383 and
384 .I fsdirfwstat
385 execute
386 .I stat
387 and
388 .I wstat
389 (see
390 .IR stat (9p))
391 transactions.
392 The
393 .B Dir
394 structure returned by
395 .I fsdirfstat
396 should be freed with
397 .I free
398 (see
399 .MR malloc (3) )
400 when no longer needed.
401 .PP
402 .I Fsdirstat
403 and
404 .I fsdirwstat
405 are similar to
406 .I fsdirfstat
407 and
408 .I fsdirfwstat
409 but operate on paths relative to the file system root
410 (see
411 .I fsopen
412 and
413 .I fscreate
414 above).
415 .PP
416 .I Fsopenfd
417 opens a file on the 9P server
418 for reading or writing but returns a Unix file descriptor
419 instead of a fid structure.
420 The file descriptor is actually one end of a
421 .MR pipe (2) .
422 A proxy process on the other end is ferrying data
423 between the pipe and the 9P fid.
424 Because of the implementation as a pipe,
425 the only signal of a read or write error is the closing of the pipe.
426 The file descriptor remains valid even after the
427 .B CFsys
428 is unmounted.
429 .PP
430 .I Nsopen
431 opens a single file on a name space server: it runs
432 .IR nsmount ,
433 .IR fsopen ,
434 and then
435 .IR fsunmount .
436 .PP
437 If the
438 .B chatty9pclient
439 flag is set, the library prints all 9P messages
440 to standard error.
441 If the
442 .B eofkill9pclient
443 flag is set, the library calls
444 .I threadexitsall
445 (see
446 .MR thread (3) )
447 when it detects EOF on a 9P connection.
448 .SH SOURCE
449 .B \*9/src/lib9pclient
450 .SH SEE ALSO
451 .MR intro (4) ,
452 .IR intro (9p),
453 .I fsaopen
454 and
455 .I nsaopen
456 in
457 .MR auth (3)
458 .SH BUGS
459 The implementation
460 should use a special version string to distinguish between
461 servers that support
462 .IR openfd (9p)
463 and servers that do not.
464 .PP
465 The interface does not provide access to the
466 .IR walk (9p)
467 transaction, or to
468 .I open
469 and
470 .I create
471 on already-established fids.