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