Blob


1 .TH 9P 3
2 .SH NAME
3 Srv,
4 dirread9p,
5 emalloc9p,
6 erealloc9p,
7 estrdup9p,
8 postfd,
9 readbuf,
10 readstr,
11 respond,
12 srv,
13 threadpostmountsrv,
14 walkandclone \- 9P file service
15 .SH SYNOPSIS
16 .ft L
17 .nf
18 #include <u.h>
19 #include <libc.h>
20 #include <fcall.h>
21 #include <thread.h>
22 #include <9p.h>
23 .fi
24 .PP
25 .ft L
26 .nf
27 .ta \w'\fL1234'u +\w'\fLTree* 'u
28 typedef struct Srv {
29 Tree* tree;
31 void (*attach)(Req *r);
32 void (*auth)(Req *r);
33 void (*open)(Req *r);
34 void (*create)(Req *r);
35 void (*read)(Req *r);
36 void (*write)(Req *r);
37 void (*remove)(Req *r);
38 void (*flush)(Req *r);
39 void (*stat)(Req *r);
40 void (*wstat)(Req *r);
41 void (*walk)(Req *r);
43 char* (*walk1)(Fid *fid, char *name, Qid *qid);
44 char* (*clone)(Fid *oldfid, Fid *newfid);
46 void (*destroyfid)(Fid *fid);
47 void (*destroyreq)(Req *r);
48 void (*start)(Srv *s);
49 void (*end)(Srv *s);
50 void* aux;
52 int infd;
53 int outfd;
54 int srvfd;
55 int nopipe;
56 } Srv;
57 .fi
58 .PP
59 .nf
60 .ft L
61 .ta \w'\fLvoid* 'u
62 int srv(Srv *s)
63 void threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
64 int postfd(char *srvname, int fd)
65 void respond(Req *r, char *error)
66 ulong readstr(Req *r, char *src)
67 ulong readbuf(Req *r, void *src, ulong nsrc)
68 typedef int Dirgen(int n, Dir *dir, void *aux)
69 void dirread9p(Req *r, Dirgen *gen, void *aux)
70 void walkandclone(Req *r, char *(*walk1)(Fid *old, char *name, void *v),
71 char *(*clone)(Fid *old, Fid *new, void *v), void *v)
72 .fi
73 .PP
74 .nf
75 .ft L
76 .ta \w'\fLvoid* 'u
77 void* emalloc9p(ulong n)
78 void* erealloc9p(void *v, ulong n)
79 char* estrdup9p(char *s)
80 .fi
81 .PP
82 .nf
83 .ft L
84 extern int chatty9p;
85 .fi
86 .SH DESCRIPTION
87 The function
88 .I srv
89 serves a 9P session by reading requests from
90 .BR s->infd ,
91 dispatching them to the function pointers kept in
92 .BR Srv ,
93 and
94 writing the responses to
95 .BR s->outfd .
96 (Typically,
97 .I threadpostmountsrv
98 initializes the
99 .B infd
100 and
101 .B outfd
102 structure members. See the description below.)
103 .PP
104 .B Req
105 and
106 .B Fid
107 structures are allocated one-to-one with uncompleted
108 requests and active fids, and are described in
109 .MR 9p-fid (3) .
110 .PP
111 The behavior of
112 .I srv
113 depends on whether there is a file tree
114 (see
115 .MR 9p-file (3) )
116 associated with the server, that is,
117 whether the
118 .B tree
119 element is nonzero.
120 The differences are made explicit in the
121 discussion of the service loop below.
122 The
123 .B aux
124 element is the client's, to do with as it pleases.
125 .PP
126 .I Srv
127 does not return until the 9P conversation is finished.
128 Since it is usually run in a separate process so that
129 the caller can exit, the service loop has little chance
130 to return gracefully on out of memory errors.
131 It calls
132 .IR emalloc9p ,
133 .IR erealloc9p ,
134 and
135 .I estrdup9p
136 to obtain its memory.
137 The default implementations of these functions
138 act as
139 .IR malloc ,
140 .IR realloc ,
141 and
142 .I strdup
143 but abort the program if they run out of memory.
144 If alternate behavior is desired, clients can link against
145 alternate implementations of these functions.
146 .PP
147 .I threadpostmountsrv
148 is a wrapper that creates a separate process in which to run
149 .IR srv .
150 It does the following:
151 .IP
152 If
153 .IB s -> nopipe
154 is zero (the common case),
155 initialize
156 .IB s -> infd
157 and
158 .IB s -> outfd
159 to be one end of a freshly allocated pipe,
160 with
161 .IB s -> srvfd
162 initialized as the other end.
163 .IP
164 If
165 .B name
166 is non-nil, call
167 .BI postfd( s -> srvfd ,
168 .IB name )
169 to post
170 .IB s -> srvfd
171 as
172 .BI /srv/ name .
173 .IP
174 Fork a child process via
175 .MR rfork (3)
176 or
177 .I procrfork
178 (see
179 .MR thread (3) ),
180 using the
181 .BR RFFDG ,
182 .RR RFNOTEG ,
183 .BR RFNAMEG ,
184 and
185 .BR RFMEM
186 flags.
187 The child process
188 calls
189 .IB close( s -> srvfd )
190 and then
191 .IB srv( s ) \fR;
192 it will exit once
193 .I srv
194 returns.
195 .IP
196 If
197 .I mtpt
198 is non-nil,
199 call
200 .BI amount( s -> srvfd,
201 .IB mtpt ,
202 .IB flag ,
203 \fB"")\fR;
204 otherwise, close
205 .IB s -> srvfd \fR.
206 .IP
207 The parent returns to the caller.
208 .LP
209 If any error occurs during
210 this process, the entire process is terminated by calling
211 .MR sysfatal (3) .
212 .SS Service functions
213 The functions in a
214 .B Srv
215 structure named after 9P transactions
216 are called to satisfy requests as they arrive.
217 If a function is provided, it
218 .I must
219 arrange for
220 .I respond
221 to be called when the request is satisfied.
222 The only parameter of each service function
223 is a
224 .B Req*
225 parameter (say
226 .IR r ).
227 The incoming request parameters are stored in
228 .IB r -> ifcall \fR;
229 .IB r -> fid
230 and
231 .IB r -> newfid
232 are pointers to
233 .B Fid
234 structures corresponding to the
235 numeric fids in
236 .IB r -> ifcall \fR;
237 similarly,
238 .IB r -> oldreq
239 is the
240 .B Req
241 structure corresponding to
242 .IB r -> ifcall.oldtag \fR.
243 The outgoing response data should be stored in
244 .IB r -> ofcall \fR.
245 The one exception to this rule is that
246 .I stat
247 should fill in
248 .IB r -> d
249 rather than
250 .IB r -> ofcall.stat \fR:
251 the library will convert the structure into the machine-independent
252 wire representation.
253 Similarly,
254 .I wstat
255 may consult
256 .IB r -> d
257 rather than decoding
258 .IB r -> ifcall . stat
259 itself.
260 When a request has been handled,
261 .I respond
262 should be called with
263 .I r
264 and an error string.
265 If the request was satisfied successfully, the error
266 string should be a nil pointer.
267 Note that it is permissible for a function to return
268 without itself calling
269 .IR respond ,
270 as long as it has arranged for
271 .I respond
272 to be called at some point in the future
273 by another proc sharing its address space,
274 but see the discussion of
275 .I flush
276 below.
277 Once
278 .I respond
279 has been called, the
280 .B Req*
281 as well as any pointers it once contained must
282 be considered freed and not referenced.
283 .PP
284 If the service loop detects an error in a request
285 (e.g., an attempt to reuse an extant fid, an open of
286 an already open fid, a read from a fid opened for write, etc.)
287 it will reply with an error without consulting
288 the service functions.
289 .PP
290 The service loop provided by
291 .I srv
292 (and indirectly by
293 .I threadpostmountsrv )
294 is single-threaded.
295 If it is expected that some requests might
296 block, arranging for alternate processes
297 to handle them is suggested.
298 .PP
299 The constraints on the service functions are as follows.
300 These constraints are checked while the server executes.
301 If a service function fails to do something it ought to have,
302 .I srv
303 will call
304 .I end
305 and then abort.
306 .TP
307 .I Auth
308 If authentication is desired,
309 the
310 .I auth
311 function should record that
312 .I afid
313 is the new authentication fid and
314 set
315 .I afid->qid
316 and
317 .IR ofcall.qid .
318 .I Auth
319 may be nil, in which case it will be treated as having
320 responded with the error
321 .RI `` "argv0: authentication not required" ,''
322 where
323 .I argv0
324 is the program name variable as set by
325 .I ARGBEGIN
326 (see
327 .MR arg (3) ).
328 .TP
329 .I Attach
330 The
331 .I attach
332 function should check the authentication state of
333 .I afid
334 if desired,
335 and set
336 .IB r -> fid -> qid
337 and
338 .I ofcall.qid
339 to the qid of the file system root.
340 .I Attach
341 may be nil only if file trees are in use;
342 in this case, the qid will be filled from the root
343 of the tree, and no authentication will be done.
344 .TP
345 .I Walk
346 If file trees are in use,
347 .I walk
348 is handled internally, and
349 .IB srv -> walk
350 is never called.
351 .IP
352 If file trees are not in use,
353 .I walk
354 should consult
355 .IB r -> ifcall . wname
356 and
357 .IB r -> ifcall . nwname \fR,
358 filling in
359 .IB ofcall . qid
360 and
361 .IB ofcall . nqid \fR,
362 and also copying any necessary
363 .I aux
364 state from
365 .IB r -> fid
366 to
367 .IB r -> newfid
368 when the two are different.
369 As long as
370 .I walk
371 sets
372 .IB ofcall . nqid
373 appropriately, it can
374 .I respond
375 with a nil error string even when 9P
376 demands an error
377 .RI ( e.g. ,
378 in the case of a short walk);
379 the library detects error conditions and handles them appropriately.
380 .IP
381 Because implementing the full walk message is intricate and
382 prone to error, the helper routine
383 .I walkandclone
384 will handle the request given pointers to two functions
385 .I walk1
386 and (optionally)
387 .I clone .
388 .IR Clone ,
389 if non-nil, is called to signal the creation of
390 .I newfid
391 from
392 .IR oldfid .
393 Typically a
394 .I clone
395 routine will copy or increment a reference count in
396 .IR oldfid 's
397 .I aux
398 element.
399 .I Walk1
400 should walk
401 .I fid
402 to
403 .IR name ,
404 initializing
405 .IB fid -> qid
406 to the new path's qid.
407 Both should return nil
408 on success or an error message on error.
409 .I Walkandclone
410 will call
411 .I respond
412 after handling the request.
413 .TP
414 .I Walk1\fR, \fPClone
415 If the client provides functions
416 .IB srv -> walk1
417 and (optionally)
418 .IB srv -> clone \fR,
419 the 9P service loop will call
420 .I walkandclone
421 with these functions to handle the request.
422 Unlike the
423 .I walk1
424 above,
425 .IB srv -> walk1
426 must fill in both
427 .IB fid -> qid
428 and
429 .BI * qid
430 with the new qid on a successful walk.
431 .TP
432 .I Open
433 If file trees are in use, the file
434 metadata will be consulted on open, create, remove, and wstat
435 to see if the requester has the appropriate permissions.
436 If not, an error will be sent back without consulting a service function.
437 .PP
438 If not using file trees or the user has the appropriate permissions,
439 .I open
440 is called with
441 .IB r -> ofcall . qid
442 already initialized to the one stored in the
443 .B Fid
444 structure (that is, the one returned in the previous walk).
445 If the qid changes, both should be updated.
446 .TP
447 .I Create
448 The
449 .I create
450 function must fill in
451 both
452 .IB r -> fid -> qid
453 and
454 .IB r -> ofcall . qid
455 on success.
456 When using file trees,
457 .I create
458 should allocate a new
459 .B File
460 with
461 .IR createfile ;
462 note that
463 .I createfile
464 may return nil (because, say, the file already exists).
465 If the
466 .I create
467 function is nil,
468 .I srv
469 behaves as though it were a function that always responded
470 with the error ``create prohibited''.
471 .TP
472 .I Remove
473 .I Remove
474 should mark the file as removed, whether
475 by calling
476 .I removefile
477 when using file trees, or by updating an internal data structure.
478 In general it is not a good idea to clean up the
479 .I aux
480 information associated with the corresponding
481 .B File
482 at this time, to avoid memory errors if other
483 fids have references to that file.
484 Instead, it is suggested that
485 .I remove
486 simply mark the file as removed (so that further
487 operations on it know to fail) and wait until the
488 file tree's destroy function is called to reclaim the
489 .I aux
490 pointer.
491 If not using file trees, it is prudent to take the
492 analogous measures.
493 If
494 .I remove
495 is not provided, all remove requests will draw
496 ``remove prohibited'' errors.
497 .TP
498 .I Read
499 The
500 .I read
501 function must be provided; it fills
502 .IB r -> ofcall . data
503 with at most
504 .IB r -> ifcall . count
505 bytes of data from offset
506 .IB r -> ifcall . offset
507 of the file.
508 It also sets
509 .IB r -> ofcall . count
510 to the number of bytes being returned.
511 If using file trees,
512 .I srv
513 will handle reads of directories internally, only
514 calling
515 .I read
516 for requests on files.
517 .I Readstr
518 and
519 .I readbuf
520 are useful for satisfying read requests on a string or buffer.
521 Consulting the request in
522 .IB r -> ifcall \fR,
523 they fill
524 .IB r -> ofcall . data
525 and set
526 .IB r -> ofcall . count \fR;
527 they do not call
528 .IB respond .
529 Similarly,
530 .I dirread9p
531 can be used to handle directory reads in servers
532 not using file trees.
533 The passed
534 .I gen
535 function will be called as necessary to
536 fill
537 .I dir
538 with information for the
539 .IR n th
540 entry in the directory.
541 The string pointers placed in
542 .I dir
543 should be fresh copies
544 made with
545 .IR estrdup9p ;
546 they will be freed by
547 .I dirread9p
548 after each successful call to
549 .IR gen .
550 .I Gen
551 should return zero if it successfully filled
552 .IR dir ,
553 minus one on end of directory.
554 .TP
555 .I Write
556 The
557 .I write
558 function is similar but need not be provided.
559 If it is not, all writes will draw
560 ``write prohibited'' errors.
561 Otherwise,
562 .I write
563 should attempt to write the
564 .IB r -> ifcall . count
565 bytes of
566 .IB r -> ifcall . data
567 to offset
568 .IB r -> ifcall . offset
569 of the file, setting
570 .IB r -> ofcall . count
571 to the number of bytes actually written.
572 Most programs consider it an error to
573 write less than the requested amount.
574 .TP
575 .I Stat
576 .I Stat
577 should fill
578 .IB r -> d
579 with the stat information for
580 .IB r -> fid \fR.
581 If using file trees,
582 .IB r -> d
583 will have been initialized with the stat info from
584 the tree, and
585 .I stat
586 itself may be nil.
587 .TP
588 .I Wstat
589 The
590 .I wstat
591 consults
592 .IB r -> d
593 in changing the metadata for
594 .IB r -> fid
595 as described in
596 .IR stat (9p).
597 When using file trees,
598 .I srv
599 will take care to check that the request satisfies
600 the permissions outlined in
601 .IR stat (9p).
602 Otherwise
603 .I wstat
604 should take care to enforce permissions
605 where appropriate.
606 .TP
607 .I Flush
608 Servers that always call
609 .I respond
610 before returning from the service functions
611 need not provide a
612 .I flush
613 implementation:
614 .I flush
615 is only necessary in programs that
616 arrange for
617 .I respond
618 to be called asynchronously.
619 .I Flush
620 should cause the request
621 .IB r -> oldreq
622 to be cancelled or hurried along.
623 If
624 .I oldreq
625 is cancelled, this should be signalled by calling
626 .I respond
627 on
628 .I oldreq
629 with error string
630 .RB ` interrupted '.
631 .I Flush
632 must respond to
633 .I r
634 with a nil error string.
635 .I Flush
636 may respond to
637 .I r
638 before forcing a response to
639 .IB r -> oldreq \fR.
640 In this case, the library will delay sending
641 the
642 .I Rflush
643 message until the response to
644 .IB r -> oldreq
645 has been sent.
646 .PD
647 .PP
648 .IR Destroyfid ,
649 .IR destroyreq ,
650 .IR start ,
651 and
652 .I end
653 are auxiliary functions, not called in direct response to 9P requests.
654 .TP
655 .I Destroyfid
656 When a
657 .BR Fid 's
658 reference count drops to zero
659 .RI ( i.e.,
660 it has been clunked and there are no outstanding
661 requests referring to it),
662 .I destroyfid
663 is called to allow the program to dispose
664 of the
665 .IB fid -> aux
666 pointer.
667 .TP
668 .I Destroyreq
669 Similarly, when a
670 .BR Req 's
671 reference count drops to zero
672 .RI ( i.e. ,
673 it has been handled via
674 .I respond
675 and other outstanding pointers to it have been closed),
676 .I destroyreq
677 is called to allow the program to dispose of the
678 .IB r -> aux
679 pointer.
680 .TP
681 .I Start
682 Before the 9P service loop begins, the service proc calls
683 .I start
684 so that the server can run any initialization that must be
685 done from inside the service proc.
686 .TP
687 .I End
688 Once the 9P service loop has finished
689 (end of file been reached on the service pipe
690 or a bad message has been read),
691 .I end
692 is called (if provided) to allow any final cleanup.
693 For example, it was used by the Palm Pilot synchronization
694 file system (never finished) to gracefully terminate the serial conversation once
695 the file system had been unmounted.
696 After calling
697 .IR end ,
698 the service loop (which runs in a separate process
699 from its caller) terminates using
700 .I _exits
701 (see
702 .MR exits (3) ).
703 .PD
704 .PP
705 If the
706 .B chatty9p
707 flag is at least one,
708 a transcript of the 9P session is printed
709 on standard error.
710 If the
711 .B chatty9p
712 flag is greater than one,
713 additional unspecified debugging output is generated.
714 By convention, servers written using this library
715 accept the
716 .B -D
717 option to increment
718 .BR chatty9p .
719 .SH EXAMPLES
720 .B \*9/src/lib9p/ramfs.c
721 is an example of a simple single-threaded file server.
722 On Plan 9, see
723 .IR archfs ,
724 .IR cdfs ,
725 .IR nntpfs ,
726 .IR webfs ,
727 and
728 .I sshnet
729 for more examples.
730 .PP
731 In general, the
732 .B File
733 interface is appropriate for maintaining arbitrary file trees (as in
734 .IR ramfs ).
735 The
736 .B File
737 interface is best avoided when the
738 tree structure is easily generated as necessary;
739 this is true when the tree is highly structured (as in
740 .I cdfs
741 and
742 .IR nntpfs )
743 or is maintained elsewhere.
744 .SH SOURCE
745 .B \*9/src/lib9p
746 .SH SEE ALSO
747 .MR 9p-fid (3) ,
748 .MR 9p-file (3) ,
749 .IR intro (9p)