Blame


1 056fe1ba 2003-11-23 devnull #include <u.h>
2 056fe1ba 2003-11-23 devnull #include <libc.h>
3 056fe1ba 2003-11-23 devnull #include <venti.h>
4 056fe1ba 2003-11-23 devnull
5 056fe1ba 2003-11-23 devnull static int
6 056fe1ba 2003-11-23 devnull vtfcallrpc(VtConn *z, VtFcall *ou, VtFcall *in)
7 056fe1ba 2003-11-23 devnull {
8 056fe1ba 2003-11-23 devnull Packet *p;
9 056fe1ba 2003-11-23 devnull
10 056fe1ba 2003-11-23 devnull p = vtfcallpack(ou);
11 056fe1ba 2003-11-23 devnull if(p == nil)
12 056fe1ba 2003-11-23 devnull return -1;
13 056fe1ba 2003-11-23 devnull if((p = vtrpc(z, p)) == nil)
14 056fe1ba 2003-11-23 devnull return -1;
15 056fe1ba 2003-11-23 devnull if(vtfcallunpack(in, p) < 0){
16 056fe1ba 2003-11-23 devnull packetfree(p);
17 056fe1ba 2003-11-23 devnull return -1;
18 056fe1ba 2003-11-23 devnull }
19 056fe1ba 2003-11-23 devnull if(in->type == VtRerror){
20 056fe1ba 2003-11-23 devnull werrstr(in->error);
21 056fe1ba 2003-11-23 devnull vtfcallclear(in);
22 056fe1ba 2003-11-23 devnull packetfree(p);
23 056fe1ba 2003-11-23 devnull return -1;
24 056fe1ba 2003-11-23 devnull }
25 056fe1ba 2003-11-23 devnull if(in->type != ou->type+1){
26 056fe1ba 2003-11-23 devnull werrstr("type mismatch: sent %c%d got %c%d",
27 056fe1ba 2003-11-23 devnull "TR"[ou->type&1], ou->type>>1,
28 056fe1ba 2003-11-23 devnull "TR"[in->type&1], in->type>>1);
29 056fe1ba 2003-11-23 devnull vtfcallclear(in);
30 056fe1ba 2003-11-23 devnull packetfree(p);
31 056fe1ba 2003-11-23 devnull return -1;
32 056fe1ba 2003-11-23 devnull }
33 056fe1ba 2003-11-23 devnull packetfree(p);
34 056fe1ba 2003-11-23 devnull return 0;
35 056fe1ba 2003-11-23 devnull }
36 056fe1ba 2003-11-23 devnull
37 056fe1ba 2003-11-23 devnull int
38 056fe1ba 2003-11-23 devnull vthello(VtConn *z)
39 056fe1ba 2003-11-23 devnull {
40 056fe1ba 2003-11-23 devnull VtFcall tx, rx;
41 056fe1ba 2003-11-23 devnull
42 056fe1ba 2003-11-23 devnull memset(&tx, 0, sizeof tx);
43 056fe1ba 2003-11-23 devnull tx.type = VtThello;
44 056fe1ba 2003-11-23 devnull tx.version = z->version;
45 056fe1ba 2003-11-23 devnull tx.uid = z->uid;
46 056fe1ba 2003-11-23 devnull if(tx.uid == nil)
47 056fe1ba 2003-11-23 devnull tx.uid = "anonymous";
48 056fe1ba 2003-11-23 devnull if(vtfcallrpc(z, &tx, &rx) < 0)
49 056fe1ba 2003-11-23 devnull return -1;
50 056fe1ba 2003-11-23 devnull z->sid = rx.sid;
51 056fe1ba 2003-11-23 devnull rx.sid = 0;
52 056fe1ba 2003-11-23 devnull vtfcallclear(&rx);
53 056fe1ba 2003-11-23 devnull return 0;
54 056fe1ba 2003-11-23 devnull }
55 056fe1ba 2003-11-23 devnull
56 056fe1ba 2003-11-23 devnull Packet*
57 056fe1ba 2003-11-23 devnull vtreadpacket(VtConn *z, uchar score[VtScoreSize], uint type, int n)
58 056fe1ba 2003-11-23 devnull {
59 056fe1ba 2003-11-23 devnull VtFcall tx, rx;
60 056fe1ba 2003-11-23 devnull
61 056fe1ba 2003-11-23 devnull memset(&tx, 0, sizeof tx);
62 056fe1ba 2003-11-23 devnull tx.type = VtTread;
63 056fe1ba 2003-11-23 devnull tx.dtype = type;
64 056fe1ba 2003-11-23 devnull tx.count = n;
65 056fe1ba 2003-11-23 devnull memmove(tx.score, score, VtScoreSize);
66 056fe1ba 2003-11-23 devnull if(vtfcallrpc(z, &tx, &rx) < 0)
67 056fe1ba 2003-11-23 devnull return nil;
68 056fe1ba 2003-11-23 devnull if(packetsize(rx.data) > n){
69 056fe1ba 2003-11-23 devnull werrstr("read returned too much data");
70 056fe1ba 2003-11-23 devnull packetfree(rx.data);
71 056fe1ba 2003-11-23 devnull return nil;
72 056fe1ba 2003-11-23 devnull }
73 056fe1ba 2003-11-23 devnull packetsha1(rx.data, tx.score);
74 056fe1ba 2003-11-23 devnull if(memcmp(score, tx.score, VtScoreSize) != 0){
75 056fe1ba 2003-11-23 devnull werrstr("read asked for %V got %V", score, tx.score);
76 056fe1ba 2003-11-23 devnull packetfree(rx.data);
77 056fe1ba 2003-11-23 devnull return nil;
78 056fe1ba 2003-11-23 devnull }
79 056fe1ba 2003-11-23 devnull
80 056fe1ba 2003-11-23 devnull return rx.data;
81 056fe1ba 2003-11-23 devnull }
82 056fe1ba 2003-11-23 devnull
83 056fe1ba 2003-11-23 devnull int
84 056fe1ba 2003-11-23 devnull vtread(VtConn *z, uchar score[VtScoreSize], uint type, uchar *buf, int n)
85 056fe1ba 2003-11-23 devnull {
86 056fe1ba 2003-11-23 devnull int nn;
87 056fe1ba 2003-11-23 devnull Packet *p;
88 056fe1ba 2003-11-23 devnull
89 056fe1ba 2003-11-23 devnull if((p = vtreadpacket(z, score, type, n)) == nil)
90 056fe1ba 2003-11-23 devnull return -1;
91 056fe1ba 2003-11-23 devnull nn = packetsize(p);
92 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, nn) < 0)
93 056fe1ba 2003-11-23 devnull abort();
94 056fe1ba 2003-11-23 devnull return nn;
95 056fe1ba 2003-11-23 devnull }
96 056fe1ba 2003-11-23 devnull
97 056fe1ba 2003-11-23 devnull int
98 056fe1ba 2003-11-23 devnull vtwritepacket(VtConn *z, uchar score[VtScoreSize], uint type, Packet *p)
99 056fe1ba 2003-11-23 devnull {
100 056fe1ba 2003-11-23 devnull VtFcall tx, rx;
101 056fe1ba 2003-11-23 devnull
102 056fe1ba 2003-11-23 devnull tx.type = VtTwrite;
103 056fe1ba 2003-11-23 devnull tx.dtype = type;
104 056fe1ba 2003-11-23 devnull tx.data = p;
105 056fe1ba 2003-11-23 devnull packetsha1(p, score);
106 056fe1ba 2003-11-23 devnull if(vtfcallrpc(z, &tx, &rx) < 0)
107 056fe1ba 2003-11-23 devnull return -1;
108 056fe1ba 2003-11-23 devnull if(memcmp(score, rx.score, VtScoreSize) != 0){
109 056fe1ba 2003-11-23 devnull werrstr("sha1 hash mismatch: want %V got %V", score, rx.score);
110 056fe1ba 2003-11-23 devnull return -1;
111 056fe1ba 2003-11-23 devnull }
112 056fe1ba 2003-11-23 devnull return 0;
113 056fe1ba 2003-11-23 devnull }
114 056fe1ba 2003-11-23 devnull
115 056fe1ba 2003-11-23 devnull int
116 056fe1ba 2003-11-23 devnull vtwrite(VtConn *z, uchar score[VtScoreSize], uint type, uchar *buf, int n)
117 056fe1ba 2003-11-23 devnull {
118 056fe1ba 2003-11-23 devnull Packet *p;
119 056fe1ba 2003-11-23 devnull
120 056fe1ba 2003-11-23 devnull p = packetforeign(buf, n, nil, nil);
121 056fe1ba 2003-11-23 devnull return vtwritepacket(z, score, type, p);
122 056fe1ba 2003-11-23 devnull }
123 056fe1ba 2003-11-23 devnull
124 056fe1ba 2003-11-23 devnull int
125 056fe1ba 2003-11-23 devnull vtsync(VtConn *z)
126 056fe1ba 2003-11-23 devnull {
127 056fe1ba 2003-11-23 devnull VtFcall tx, rx;
128 056fe1ba 2003-11-23 devnull
129 056fe1ba 2003-11-23 devnull tx.type = VtTsync;
130 056fe1ba 2003-11-23 devnull return vtfcallrpc(z, &tx, &rx);
131 056fe1ba 2003-11-23 devnull }
132 056fe1ba 2003-11-23 devnull
133 056fe1ba 2003-11-23 devnull int
134 056fe1ba 2003-11-23 devnull vtping(VtConn *z)
135 056fe1ba 2003-11-23 devnull {
136 056fe1ba 2003-11-23 devnull VtFcall tx, rx;
137 056fe1ba 2003-11-23 devnull
138 056fe1ba 2003-11-23 devnull tx.type = VtTping;
139 056fe1ba 2003-11-23 devnull return vtfcallrpc(z, &tx, &rx);
140 056fe1ba 2003-11-23 devnull }
141 056fe1ba 2003-11-23 devnull
142 056fe1ba 2003-11-23 devnull int
143 056fe1ba 2003-11-23 devnull vtconnect(VtConn *z)
144 056fe1ba 2003-11-23 devnull {
145 056fe1ba 2003-11-23 devnull if(vtversion(z) < 0)
146 056fe1ba 2003-11-23 devnull return -1;
147 056fe1ba 2003-11-23 devnull if(vthello(z) < 0)
148 056fe1ba 2003-11-23 devnull return -1;
149 056fe1ba 2003-11-23 devnull return 0;
150 056fe1ba 2003-11-23 devnull }
151 056fe1ba 2003-11-23 devnull