| .TH VENTI-SERVER 3 |
| .SH NAME |
| vtsrvhello, vtlisten, vtgetreq, vtrespond \- Venti server |
| .SH SYNOPSIS |
| .PP |
| .ft L |
| #include <u.h> |
| .br |
| #include <libc.h> |
| .br |
| #include <venti.h> |
| .ta +\w'\fLVtReq* 'u |
| .PP |
| .ft L |
| .nf |
| typedef struct VtReq |
| { |
| VtFcall tx; |
| VtFcall rx; |
| ... |
| } VtReq; |
| .PP |
| .B |
| int vtsrvhello(VtConn *z) |
| .PP |
| .B |
| VtSrv* vtlisten(char *addr) |
| .PP |
| .B |
| VtReq* vtgetreq(VtSrv *srv) |
| .PP |
| .B |
| void vtrespond(VtReq *req) |
| .SH DESCRIPTION |
| These routines execute the server side of the |
| .IR venti (7) |
| protocol. |
| .PP |
| .I Vtsrvhello |
| executes the server side of the initial |
| .B hello |
| transaction. |
| It sets |
| .IB z -> uid |
| with the user name claimed by the other side. |
| Each new connection must be initialized by running |
| .I vtversion |
| and then |
| .IR vtsrvhello . |
| The framework below takes care of this detail automatically; |
| .I vtsrvhello |
| is provided for programs that do not use the functions below. |
| .PP |
| .IR Vtlisten , |
| .IR vtgetreq , |
| and |
| .I vtrespond |
| provide a simple framework for writing Venti servers. |
| .PP |
| .I Vtlisten |
| announces at the network address |
| .IR addr , |
| returning a fresh |
| .B VtSrv |
| structure representing the service. |
| .PP |
| .I Vtgetreq |
| waits for and returns |
| the next |
| .BR read , |
| .BR write , |
| .BR sync , |
| or |
| .B ping |
| request from any client connected to |
| the service |
| .IR srv . |
| .B Hello |
| and |
| .B goodbye |
| messages are handled internally and not returned to the client. |
| The interface does not distinguish between the |
| different clients that may be connected at any given time. |
| The request can be found in the |
| .I tx |
| field of the returned |
| .BR VtReq . |
| .PP |
| Once a request has been served and a response stored in |
| .IB r ->rx \fR, |
| the server should call |
| .IR vtrespond |
| to send the response to the client. |
| .I Vtrespond |
| frees the structure |
| .I r |
| as well as the packets |
| .IB r ->tx.data |
| and |
| .IB r ->rx.data \fR. |
| .SH EXAMPLE |
| .B \*9/src/venti/cmd |
| contains two simple Venti servers |
| .B ro.c |
| and |
| .B devnull.c |
| written using these routines. |
| .I Ro |
| is a read-only Venti proxy (it rejects |
| .B write |
| requests). |
| .I Devnull |
| is a dangerous write-only Venti server: it discards all |
| blocks written to it and returns error on all reads. |
| .SH SOURCE |
| .B \*9/src/libventi |
| .SH SEE ALSO |
| .IR venti (3), |
| .IR venti-conn (3), |
| .IR venti-packet (3), |
| .IR venti (7), |
| .IR venti (8) |