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 Packet*
6 056fe1ba 2003-11-23 devnull vtfcallpack(VtFcall *f)
7 056fe1ba 2003-11-23 devnull {
8 056fe1ba 2003-11-23 devnull uchar buf[4];
9 056fe1ba 2003-11-23 devnull Packet *p;
10 056fe1ba 2003-11-23 devnull
11 056fe1ba 2003-11-23 devnull p = packetalloc();
12 056fe1ba 2003-11-23 devnull
13 7643b263 2005-07-13 devnull buf[0] = f->msgtype;
14 056fe1ba 2003-11-23 devnull buf[1] = f->tag;
15 056fe1ba 2003-11-23 devnull packetappend(p, buf, 2);
16 056fe1ba 2003-11-23 devnull
17 7643b263 2005-07-13 devnull switch(f->msgtype){
18 056fe1ba 2003-11-23 devnull default:
19 7643b263 2005-07-13 devnull werrstr("vtfcallpack: unknown packet type %d", f->msgtype);
20 056fe1ba 2003-11-23 devnull goto Err;
21 056fe1ba 2003-11-23 devnull
22 056fe1ba 2003-11-23 devnull case VtRerror:
23 056fe1ba 2003-11-23 devnull if(vtputstring(p, f->error) < 0)
24 056fe1ba 2003-11-23 devnull goto Err;
25 056fe1ba 2003-11-23 devnull break;
26 056fe1ba 2003-11-23 devnull
27 056fe1ba 2003-11-23 devnull case VtTping:
28 056fe1ba 2003-11-23 devnull break;
29 056fe1ba 2003-11-23 devnull
30 056fe1ba 2003-11-23 devnull case VtRping:
31 056fe1ba 2003-11-23 devnull break;
32 056fe1ba 2003-11-23 devnull
33 056fe1ba 2003-11-23 devnull case VtThello:
34 056fe1ba 2003-11-23 devnull if(vtputstring(p, f->version) < 0
35 056fe1ba 2003-11-23 devnull || vtputstring(p, f->uid) < 0)
36 056fe1ba 2003-11-23 devnull goto Err;
37 056fe1ba 2003-11-23 devnull buf[0] = f->strength;
38 056fe1ba 2003-11-23 devnull buf[1] = f->ncrypto;
39 056fe1ba 2003-11-23 devnull packetappend(p, buf, 2);
40 056fe1ba 2003-11-23 devnull packetappend(p, f->crypto, f->ncrypto);
41 056fe1ba 2003-11-23 devnull buf[0] = f->ncodec;
42 056fe1ba 2003-11-23 devnull packetappend(p, buf, 1);
43 056fe1ba 2003-11-23 devnull packetappend(p, f->codec, f->ncodec);
44 056fe1ba 2003-11-23 devnull break;
45 056fe1ba 2003-11-23 devnull
46 056fe1ba 2003-11-23 devnull case VtRhello:
47 056fe1ba 2003-11-23 devnull if(vtputstring(p, f->sid) < 0)
48 056fe1ba 2003-11-23 devnull goto Err;
49 056fe1ba 2003-11-23 devnull buf[0] = f->rcrypto;
50 056fe1ba 2003-11-23 devnull buf[1] = f->rcodec;
51 056fe1ba 2003-11-23 devnull packetappend(p, buf, 2);
52 056fe1ba 2003-11-23 devnull break;
53 056fe1ba 2003-11-23 devnull
54 056fe1ba 2003-11-23 devnull case VtTgoodbye:
55 056fe1ba 2003-11-23 devnull break;
56 056fe1ba 2003-11-23 devnull
57 056fe1ba 2003-11-23 devnull case VtTread:
58 056fe1ba 2003-11-23 devnull packetappend(p, f->score, VtScoreSize);
59 7643b263 2005-07-13 devnull buf[0] = vttodisktype(f->blocktype);
60 056fe1ba 2003-11-23 devnull if(~buf[0] == 0)
61 056fe1ba 2003-11-23 devnull goto Err;
62 056fe1ba 2003-11-23 devnull buf[1] = 0;
63 056fe1ba 2003-11-23 devnull buf[2] = f->count >> 8;
64 056fe1ba 2003-11-23 devnull buf[3] = f->count;
65 056fe1ba 2003-11-23 devnull packetappend(p, buf, 4);
66 056fe1ba 2003-11-23 devnull break;
67 056fe1ba 2003-11-23 devnull
68 056fe1ba 2003-11-23 devnull case VtRread:
69 056fe1ba 2003-11-23 devnull packetconcat(p, f->data);
70 056fe1ba 2003-11-23 devnull break;
71 056fe1ba 2003-11-23 devnull
72 056fe1ba 2003-11-23 devnull case VtTwrite:
73 7643b263 2005-07-13 devnull buf[0] = vttodisktype(f->blocktype);
74 056fe1ba 2003-11-23 devnull if(~buf[0] == 0)
75 056fe1ba 2003-11-23 devnull goto Err;
76 056fe1ba 2003-11-23 devnull buf[1] = 0;
77 056fe1ba 2003-11-23 devnull buf[2] = 0;
78 056fe1ba 2003-11-23 devnull buf[3] = 0;
79 056fe1ba 2003-11-23 devnull packetappend(p, buf, 4);
80 056fe1ba 2003-11-23 devnull packetconcat(p, f->data);
81 056fe1ba 2003-11-23 devnull break;
82 056fe1ba 2003-11-23 devnull
83 056fe1ba 2003-11-23 devnull case VtRwrite:
84 056fe1ba 2003-11-23 devnull packetappend(p, f->score, VtScoreSize);
85 056fe1ba 2003-11-23 devnull break;
86 056fe1ba 2003-11-23 devnull
87 056fe1ba 2003-11-23 devnull case VtTsync:
88 056fe1ba 2003-11-23 devnull break;
89 056fe1ba 2003-11-23 devnull
90 056fe1ba 2003-11-23 devnull case VtRsync:
91 056fe1ba 2003-11-23 devnull break;
92 056fe1ba 2003-11-23 devnull }
93 056fe1ba 2003-11-23 devnull
94 056fe1ba 2003-11-23 devnull return p;
95 056fe1ba 2003-11-23 devnull
96 056fe1ba 2003-11-23 devnull Err:
97 056fe1ba 2003-11-23 devnull packetfree(p);
98 056fe1ba 2003-11-23 devnull return nil;
99 056fe1ba 2003-11-23 devnull }
100 056fe1ba 2003-11-23 devnull
101 056fe1ba 2003-11-23 devnull int
102 056fe1ba 2003-11-23 devnull vtfcallunpack(VtFcall *f, Packet *p)
103 056fe1ba 2003-11-23 devnull {
104 056fe1ba 2003-11-23 devnull uchar buf[4];
105 056fe1ba 2003-11-23 devnull
106 056fe1ba 2003-11-23 devnull memset(f, 0, sizeof *f);
107 056fe1ba 2003-11-23 devnull
108 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, 2) < 0)
109 056fe1ba 2003-11-23 devnull return -1;
110 056fe1ba 2003-11-23 devnull
111 7643b263 2005-07-13 devnull f->msgtype = buf[0];
112 056fe1ba 2003-11-23 devnull f->tag = buf[1];
113 056fe1ba 2003-11-23 devnull
114 7643b263 2005-07-13 devnull switch(f->msgtype){
115 056fe1ba 2003-11-23 devnull default:
116 7643b263 2005-07-13 devnull werrstr("vtfcallunpack: unknown bad packet type %d", f->msgtype);
117 056fe1ba 2003-11-23 devnull vtfcallclear(f);
118 056fe1ba 2003-11-23 devnull return -1;
119 056fe1ba 2003-11-23 devnull
120 056fe1ba 2003-11-23 devnull case VtRerror:
121 056fe1ba 2003-11-23 devnull if(vtgetstring(p, &f->error) < 0)
122 056fe1ba 2003-11-23 devnull goto Err;
123 056fe1ba 2003-11-23 devnull break;
124 056fe1ba 2003-11-23 devnull
125 056fe1ba 2003-11-23 devnull case VtTping:
126 056fe1ba 2003-11-23 devnull break;
127 056fe1ba 2003-11-23 devnull
128 056fe1ba 2003-11-23 devnull case VtRping:
129 056fe1ba 2003-11-23 devnull break;
130 056fe1ba 2003-11-23 devnull
131 056fe1ba 2003-11-23 devnull case VtThello:
132 056fe1ba 2003-11-23 devnull if(vtgetstring(p, &f->version) < 0
133 056fe1ba 2003-11-23 devnull || vtgetstring(p, &f->uid) < 0
134 056fe1ba 2003-11-23 devnull || packetconsume(p, buf, 2) < 0)
135 056fe1ba 2003-11-23 devnull goto Err;
136 056fe1ba 2003-11-23 devnull f->strength = buf[0];
137 056fe1ba 2003-11-23 devnull f->ncrypto = buf[1];
138 056fe1ba 2003-11-23 devnull if(f->ncrypto){
139 056fe1ba 2003-11-23 devnull f->crypto = vtmalloc(f->ncrypto);
140 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, f->ncrypto) < 0)
141 056fe1ba 2003-11-23 devnull goto Err;
142 056fe1ba 2003-11-23 devnull }
143 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, 1) < 0)
144 056fe1ba 2003-11-23 devnull goto Err;
145 056fe1ba 2003-11-23 devnull f->ncodec = buf[0];
146 056fe1ba 2003-11-23 devnull if(f->ncodec){
147 056fe1ba 2003-11-23 devnull f->codec = vtmalloc(f->ncodec);
148 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, f->ncodec) < 0)
149 056fe1ba 2003-11-23 devnull goto Err;
150 056fe1ba 2003-11-23 devnull }
151 056fe1ba 2003-11-23 devnull break;
152 056fe1ba 2003-11-23 devnull
153 056fe1ba 2003-11-23 devnull case VtRhello:
154 056fe1ba 2003-11-23 devnull if(vtgetstring(p, &f->sid) < 0
155 056fe1ba 2003-11-23 devnull || packetconsume(p, buf, 2) < 0)
156 056fe1ba 2003-11-23 devnull goto Err;
157 056fe1ba 2003-11-23 devnull f->rcrypto = buf[0];
158 056fe1ba 2003-11-23 devnull f->rcodec = buf[1];
159 056fe1ba 2003-11-23 devnull break;
160 056fe1ba 2003-11-23 devnull
161 056fe1ba 2003-11-23 devnull case VtTgoodbye:
162 056fe1ba 2003-11-23 devnull break;
163 056fe1ba 2003-11-23 devnull
164 056fe1ba 2003-11-23 devnull case VtTread:
165 056fe1ba 2003-11-23 devnull if(packetconsume(p, f->score, VtScoreSize) < 0
166 056fe1ba 2003-11-23 devnull || packetconsume(p, buf, 4) < 0)
167 056fe1ba 2003-11-23 devnull goto Err;
168 7643b263 2005-07-13 devnull f->blocktype = vtfromdisktype(buf[0]);
169 7643b263 2005-07-13 devnull if(~f->blocktype == 0)
170 056fe1ba 2003-11-23 devnull goto Err;
171 056fe1ba 2003-11-23 devnull f->count = (buf[2] << 8) | buf[3];
172 056fe1ba 2003-11-23 devnull break;
173 056fe1ba 2003-11-23 devnull
174 056fe1ba 2003-11-23 devnull case VtRread:
175 056fe1ba 2003-11-23 devnull f->data = packetalloc();
176 056fe1ba 2003-11-23 devnull packetconcat(f->data, p);
177 056fe1ba 2003-11-23 devnull break;
178 056fe1ba 2003-11-23 devnull
179 056fe1ba 2003-11-23 devnull case VtTwrite:
180 056fe1ba 2003-11-23 devnull if(packetconsume(p, buf, 4) < 0)
181 056fe1ba 2003-11-23 devnull goto Err;
182 7643b263 2005-07-13 devnull f->blocktype = vtfromdisktype(buf[0]);
183 7643b263 2005-07-13 devnull if(~f->blocktype == 0)
184 056fe1ba 2003-11-23 devnull goto Err;
185 056fe1ba 2003-11-23 devnull f->data = packetalloc();
186 056fe1ba 2003-11-23 devnull packetconcat(f->data, p);
187 056fe1ba 2003-11-23 devnull break;
188 056fe1ba 2003-11-23 devnull
189 056fe1ba 2003-11-23 devnull case VtRwrite:
190 056fe1ba 2003-11-23 devnull if(packetconsume(p, f->score, VtScoreSize) < 0)
191 056fe1ba 2003-11-23 devnull goto Err;
192 056fe1ba 2003-11-23 devnull break;
193 056fe1ba 2003-11-23 devnull
194 056fe1ba 2003-11-23 devnull case VtTsync:
195 056fe1ba 2003-11-23 devnull break;
196 056fe1ba 2003-11-23 devnull
197 056fe1ba 2003-11-23 devnull case VtRsync:
198 056fe1ba 2003-11-23 devnull break;
199 056fe1ba 2003-11-23 devnull }
200 056fe1ba 2003-11-23 devnull
201 056fe1ba 2003-11-23 devnull if(packetsize(p) != 0)
202 056fe1ba 2003-11-23 devnull goto Err;
203 056fe1ba 2003-11-23 devnull
204 056fe1ba 2003-11-23 devnull return 0;
205 056fe1ba 2003-11-23 devnull
206 056fe1ba 2003-11-23 devnull Err:
207 056fe1ba 2003-11-23 devnull werrstr("bad packet");
208 056fe1ba 2003-11-23 devnull return -1;
209 056fe1ba 2003-11-23 devnull }
210 056fe1ba 2003-11-23 devnull
211 056fe1ba 2003-11-23 devnull void
212 056fe1ba 2003-11-23 devnull vtfcallclear(VtFcall *f)
213 056fe1ba 2003-11-23 devnull {
214 056fe1ba 2003-11-23 devnull vtfree(f->error);
215 056fe1ba 2003-11-23 devnull f->error = nil;
216 056fe1ba 2003-11-23 devnull vtfree(f->uid);
217 056fe1ba 2003-11-23 devnull f->uid = nil;
218 056fe1ba 2003-11-23 devnull vtfree(f->sid);
219 056fe1ba 2003-11-23 devnull f->sid = nil;
220 056fe1ba 2003-11-23 devnull vtfree(f->version);
221 056fe1ba 2003-11-23 devnull f->version = nil;
222 056fe1ba 2003-11-23 devnull vtfree(f->crypto);
223 056fe1ba 2003-11-23 devnull f->crypto = nil;
224 056fe1ba 2003-11-23 devnull vtfree(f->codec);
225 056fe1ba 2003-11-23 devnull f->codec = nil;
226 056fe1ba 2003-11-23 devnull vtfree(f->auth);
227 056fe1ba 2003-11-23 devnull f->auth = nil;
228 056fe1ba 2003-11-23 devnull packetfree(f->data);
229 7cb74894 2004-06-17 devnull f->data = nil;
230 056fe1ba 2003-11-23 devnull }