|  | .TH VENTI-CONN 3 | 
|  | .SH NAME | 
|  | VtConn, vtconn, vtdial, vtfreeconn, vtsend, vtrecv, vtversion, | 
|  | vtdebug, vthangup \- Venti network connections | 
|  | .SH SYNOPSIS | 
|  | .PP | 
|  | .ft L | 
|  | #include <u.h> | 
|  | .br | 
|  | #include <libc.h> | 
|  | .br | 
|  | #include <venti.h> | 
|  | .PP | 
|  | .ft L | 
|  | .nf | 
|  | .ta +\w'\fL    'u | 
|  | typedef struct VtConn { | 
|  | int  debug; | 
|  | char *version; | 
|  | char *uid; | 
|  | char *sid; | 
|  | char addr[256]; | 
|  | ... | 
|  | } VtConn; | 
|  | .PP | 
|  | .ta \w'\fLextern int 'u | 
|  | .B | 
|  | VtConn*	vtconn(int infd, int outfd) | 
|  | .PP | 
|  | .B | 
|  | int	vtreconn(VtConn *z, int infd, int outfd) | 
|  | .PP | 
|  | .B | 
|  | VtConn*	vtdial(char *addr) | 
|  | .PP | 
|  | .B | 
|  | int	vtredial(VtConn *z, char *addr) | 
|  | .PP | 
|  | .B | 
|  | int	vtversion(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | int	vtsend(VtConn *z, Packet *p) | 
|  | .PP | 
|  | .B | 
|  | Packet*	vtrecv(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | void	vtrecvproc(void *z) | 
|  | .PP | 
|  | .B | 
|  | void	vtsendproc(void *z) | 
|  | .PP | 
|  | .B | 
|  | void	vtdebug(VtConn *z, char *fmt, ...) | 
|  | .PP | 
|  | .B | 
|  | void	vthangup(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | void	vtfreeconn(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | extern int	chattyventi;	/* default 0 */ | 
|  | .SH DESCRIPTION | 
|  | A | 
|  | .B VtConn | 
|  | structure represents a connection to a Venti server | 
|  | (when used by a client) or to a client (when used by a server). | 
|  | It contains the following user-visible fields: | 
|  | .BR debug , | 
|  | a flag enabling debugging prints; | 
|  | .BR version , | 
|  | the protocol version in use; | 
|  | .BR uid , | 
|  | the (unverified) name of the client; | 
|  | .BR sid , | 
|  | the (unverified) name of the server; | 
|  | and | 
|  | .BR addr , | 
|  | the network address of the remote side. | 
|  | .PP | 
|  | .I Vtconn | 
|  | initializes a new connection structure using file descriptors | 
|  | .I infd | 
|  | and | 
|  | .I outfd | 
|  | (which may be the same) | 
|  | for reading and writing. | 
|  | .I Vtdial | 
|  | dials the given network address | 
|  | (see | 
|  | .IR dial (3)) | 
|  | and returns a corresponding connection. | 
|  | It returns nil if the connection cannot be established. | 
|  | .PP | 
|  | .I Vtversion | 
|  | exchanges version information with the remote side | 
|  | as described in | 
|  | .IR venti (7). | 
|  | The negotiated version is stored in | 
|  | .IB z ->version \fR. | 
|  | .PP | 
|  | .I Vtsend | 
|  | writes a packet | 
|  | (see | 
|  | .IR venti-packet (3)) | 
|  | on the connection | 
|  | .IR z . | 
|  | The packet | 
|  | .IR p | 
|  | should be a formatted Venti message as might | 
|  | be returned by | 
|  | .IR vtfcallpack ; | 
|  | .I vtsend | 
|  | will add the two-byte length field | 
|  | (see | 
|  | .IR venti (7)) | 
|  | at the begnning. | 
|  | .I Vtsend | 
|  | frees | 
|  | .IR p , | 
|  | even on error. | 
|  | .PP | 
|  | .I Vtrecv | 
|  | reads a packet from the connection | 
|  | .IR z . | 
|  | Analogous to | 
|  | .IR vtsend , | 
|  | the data read from the connection must start with | 
|  | a two-byte length, but the returned packet will omit them. | 
|  | .PP | 
|  | By default, | 
|  | .I vtsend | 
|  | and | 
|  | .I vtrecv | 
|  | block until the packet can be written or read from the network. | 
|  | In a threaded program | 
|  | (see | 
|  | .IR thread (3)), | 
|  | this may not be desirable. | 
|  | If the caller arranges for | 
|  | .IR vtsendproc | 
|  | and | 
|  | .IR vtrecvproc | 
|  | to run in their own procs | 
|  | (typically by calling | 
|  | .IR proccreate ), | 
|  | then | 
|  | .I vtsend | 
|  | and | 
|  | .I vtrecv | 
|  | will yield the proc in which they are run | 
|  | to other threads when waiting on the network. | 
|  | The | 
|  | .B void* | 
|  | argument to | 
|  | .I vtsendproc | 
|  | and | 
|  | .I vtrecvproc | 
|  | must be the connection structure | 
|  | .IR z . | 
|  | .PP | 
|  | .I Vtdebug | 
|  | prints the formatted message to standard error | 
|  | when | 
|  | .IB z ->debug | 
|  | is set.  Otherwise it is a no-op. | 
|  | .PP | 
|  | .I Vthangup | 
|  | hangs up a connection. | 
|  | It closes the associated file descriptors | 
|  | and shuts down send and receive procs if they have been | 
|  | started. | 
|  | Future calls to | 
|  | .IR vtrecv | 
|  | or | 
|  | .IR vtsend | 
|  | will return errors. | 
|  | Additional calls to | 
|  | .I vthangup | 
|  | will have no effect. | 
|  | .PP | 
|  | .I Vtfreeconn | 
|  | frees the connection structure, hanging it up first | 
|  | if necessary. | 
|  | .PP | 
|  | If the global variable | 
|  | .I chattyventi | 
|  | is set, the library prints all Venti RPCs to standard error | 
|  | as they are sent or received. | 
|  | .SH SOURCE | 
|  | .B \*9/src/libventi | 
|  | .SH SEE ALSO | 
|  | .IR venti (1), | 
|  | .IR venti (3), | 
|  | .IR venti-client (3), | 
|  | .IR venti-packet (3), | 
|  | .IR venti-server (3), | 
|  | .IR venti (7) | 
|  | .SH DIAGNOSTICS | 
|  | Routines that return pointers return nil on error. | 
|  | Routines returning integers return 0 on success, \-1 on error. | 
|  | All routines set | 
|  | .I errstr | 
|  | on error. |