|  | .TH VENTI-CLIENT 3 | 
|  | .SH NAME | 
|  | vtconnect, vthello, vtread, vtwrite, vtreadpacket, vtwritepacket, vtsync, vtping, vtrpc, ventidoublechecksha1 \- Venti client | 
|  | .SH SYNOPSIS | 
|  | .ft L | 
|  | #include <u.h> | 
|  | .br | 
|  | #include <libc.h> | 
|  | .br | 
|  | #include <venti.h> | 
|  | .ta +\w'\fLPacket* 'u +\w'\fLxxxxxxxx'u | 
|  | .PP | 
|  | .B | 
|  | Packet*	vtrpc(VtConn *z, Packet *p) | 
|  | .PP | 
|  | .B | 
|  | int	vthello(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | int	vtconnect(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | int	vtread(VtConn *z, uchar score[VtScoreSize], | 
|  | .br | 
|  | .B | 
|  | uint type, uchar *buf, int n) | 
|  | .PP | 
|  | .B | 
|  | int	vtwrite(VtConn *z, uchar score[VtScoreSize], | 
|  | .br | 
|  | .B | 
|  | uint type, uchar *buf, int n) | 
|  | .PP | 
|  | .B | 
|  | Packet*	vtreadpacket(VtConn *z, uchar score[VtScoreSize], | 
|  | .br | 
|  | .B | 
|  | uint type, int n) | 
|  | .PP | 
|  | .B | 
|  | int	vtwritepacket(VtConn *z, uchar score[VtScoreSize], | 
|  | .br | 
|  | .B | 
|  | uint type, Packet *p) | 
|  | .PP | 
|  | .B | 
|  | int	vtsync(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | int	vtping(VtConn *z) | 
|  | .PP | 
|  | .B | 
|  | extern int ventidoublechecksha1;  /* default 1 */ | 
|  | .SH DESCRIPTION | 
|  | These routines execute the client side of the | 
|  | .IR venti (7) | 
|  | protocol. | 
|  | .PP | 
|  | .I Vtrpc | 
|  | executes a single Venti RPC transaction, sending the request | 
|  | packet | 
|  | .IR p | 
|  | and then waiting for and returning the response packet. | 
|  | .I Vtrpc | 
|  | will set the tag in the packet. | 
|  | .I Vtrpc | 
|  | frees | 
|  | .IR p , | 
|  | even on error. | 
|  | .I Vtrpc | 
|  | is typically called only indirectly, via the functions below. | 
|  | .PP | 
|  | .I Vthello | 
|  | executes a | 
|  | .B hello | 
|  | transaction, setting | 
|  | .IB z ->sid | 
|  | to the name used by the server. | 
|  | .I Vthello | 
|  | is typically called only indirectly, via | 
|  | .IR vtconnect . | 
|  | .PP | 
|  | .I Vtconnect | 
|  | calls | 
|  | .I vtversion | 
|  | (see | 
|  | .IR venti-conn (3)) | 
|  | and | 
|  | .IR vthello , | 
|  | in that order, returning success only | 
|  | if both succeed. | 
|  | This sequence (calling | 
|  | .I vtversion | 
|  | and then | 
|  | .IR vthello ) | 
|  | must be done before the functions below can be called. | 
|  | .PP | 
|  | .I Vtread | 
|  | reads the block with the given | 
|  | .I score | 
|  | and | 
|  | .I type | 
|  | from the server, | 
|  | stores the returned data | 
|  | in memory at | 
|  | .IR buf , | 
|  | and returns the number of bytes read. | 
|  | If the server's block has size larger than | 
|  | .IR n , | 
|  | .I vtread | 
|  | does not modify | 
|  | .I buf | 
|  | and | 
|  | returns an error. | 
|  | .PP | 
|  | .I Vtwrite | 
|  | writes the | 
|  | .I n | 
|  | bytes in | 
|  | .I buf | 
|  | as a block of the given | 
|  | .IR type , | 
|  | setting | 
|  | .IR score . | 
|  | .PP | 
|  | .I Vtreadpacket | 
|  | and | 
|  | .I vtwritepacket | 
|  | are like | 
|  | .I vtread | 
|  | and | 
|  | .I vtwrite | 
|  | but return or accept the block contents in the | 
|  | form of a | 
|  | .BR Packet . | 
|  | They avoid making a copy of the data. | 
|  | .PP | 
|  | .I Vtsync | 
|  | causes the server to flush all pending write requests | 
|  | to disk before returning. | 
|  | .PP | 
|  | .I Vtping | 
|  | executes a ping transaction with the server. | 
|  | .PP | 
|  | By default, | 
|  | .I vtread | 
|  | and | 
|  | .I vtreadpacket | 
|  | check that the SHA1 hash of the returned data | 
|  | matches the requested | 
|  | .IR score , | 
|  | and | 
|  | .I vtwrite | 
|  | and | 
|  | .I vtwritepacket | 
|  | check that the returned | 
|  | .I score | 
|  | matches the SHA1 hash of the written data. | 
|  | Setting | 
|  | .I ventidoublechecksha1 | 
|  | to zero disables these extra checks, | 
|  | mainly for benchmarking purposes. | 
|  | Doing so in production code is not recommended. | 
|  | .PP | 
|  | These functions can be called from multiple threads | 
|  | or procs simultaneously to issue requests | 
|  | in parallel. | 
|  | Programs that issue requests from multiple threads | 
|  | in the same proc should start separate procs running | 
|  | .I vtsendproc | 
|  | and | 
|  | .I vtrecvproc | 
|  | as described in | 
|  | .IR venti-conn (3). | 
|  | .SH SOURCE | 
|  | .B \*9/src/libventi | 
|  | .SH SEE ALSO | 
|  | .IR venti (3), | 
|  | .IR venti-conn (3), | 
|  | .IR venti-packet (3), | 
|  | .IR venti (7) | 
|  | .SH DIAGNOSTICS | 
|  | .I Vtrpc | 
|  | and | 
|  | .I vtpacket | 
|  | return nil on error. | 
|  | The other routines return \-1 on error. | 
|  | .PP | 
|  | .I Vtwrite | 
|  | returns 0 on success: there are no partial writes. |