123 lines
2.1 KiB
Plaintext
123 lines
2.1 KiB
Plaintext
|
.TH VENTI-SERVER 2
|
||
|
.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 (6)
|
||
|
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 /sys/src/cmd/venti
|
||
|
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 /sys/src/libventi
|
||
|
.SH SEE ALSO
|
||
|
.IR venti (2),
|
||
|
.IR venti-conn (2),
|
||
|
.IR venti-packet (2),
|
||
|
.IR venti (6),
|
||
|
.IR venti (8)
|