1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
6 a0d146ed 2005-07-12 devnull * disk structure conversion routines
8 a0d146ed 2005-07-12 devnull #define U8GET(p) ((p)[0])
9 a0d146ed 2005-07-12 devnull #define U16GET(p) (((p)[0]<<8)|(p)[1])
10 a0d146ed 2005-07-12 devnull #define U32GET(p) ((u32int)(((p)[0]<<24)|((p)[1]<<16)|((p)[2]<<8)|(p)[3]))
11 a0d146ed 2005-07-12 devnull #define U64GET(p) (((u64int)U32GET(p)<<32)|(u64int)U32GET((p)+4))
13 a0d146ed 2005-07-12 devnull #define U8PUT(p,v) (p)[0]=(v)&0xFF
14 a0d146ed 2005-07-12 devnull #define U16PUT(p,v) (p)[0]=((v)>>8)&0xFF;(p)[1]=(v)&0xFF
15 a0d146ed 2005-07-12 devnull #define U32PUT(p,v) (p)[0]=((v)>>24)&0xFF;(p)[1]=((v)>>16)&0xFF;(p)[2]=((v)>>8)&0xFF;(p)[3]=(v)&0xFF
16 a0d146ed 2005-07-12 devnull #define U64PUT(p,v,t32) t32=(v)>>32;U32PUT(p,t32);t32=(v);U32PUT((p)+4,t32)
18 a0d146ed 2005-07-12 devnull static struct {
19 a0d146ed 2005-07-12 devnull u32int m;
21 a0d146ed 2005-07-12 devnull } magics[] = {
22 a0d146ed 2005-07-12 devnull ArenaPartMagic, "ArenaPartMagic",
23 a0d146ed 2005-07-12 devnull ArenaHeadMagic, "ArenaHeadMagic",
24 a0d146ed 2005-07-12 devnull ArenaMagic, "ArenaMagic",
25 a0d146ed 2005-07-12 devnull ISectMagic, "ISectMagic",
26 a0d146ed 2005-07-12 devnull BloomMagic, "BloomMagic",
29 a0d146ed 2005-07-12 devnull static char*
30 a0d146ed 2005-07-12 devnull fmtmagic(char *s, u32int m)
34 a0d146ed 2005-07-12 devnull for(i=0; i<nelem(magics); i++)
35 a0d146ed 2005-07-12 devnull if(magics[i].m == m)
36 a0d146ed 2005-07-12 devnull return magics[i].s;
37 a0d146ed 2005-07-12 devnull sprint(s, "0x%08ux", m);
38 a0d146ed 2005-07-12 devnull return s;
42 a0d146ed 2005-07-12 devnull unpackmagic(u8int *buf)
44 a0d146ed 2005-07-12 devnull return U32GET(buf);
48 a0d146ed 2005-07-12 devnull packmagic(u32int magic, u8int *buf)
50 a0d146ed 2005-07-12 devnull U32PUT(buf, magic);
54 a0d146ed 2005-07-12 devnull unpackarenapart(ArenaPart *ap, u8int *buf)
56 a0d146ed 2005-07-12 devnull u8int *p;
57 a0d146ed 2005-07-12 devnull u32int m;
58 a0d146ed 2005-07-12 devnull char fbuf[20];
62 a0d146ed 2005-07-12 devnull m = U32GET(p);
63 a0d146ed 2005-07-12 devnull if(m != ArenaPartMagic){
64 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena set has wrong magic number: %s expected ArenaPartMagic (%lux)", fmtmagic(fbuf, m), ArenaPartMagic);
65 a0d146ed 2005-07-12 devnull return -1;
67 a0d146ed 2005-07-12 devnull p += U32Size;
68 a0d146ed 2005-07-12 devnull ap->version = U32GET(p);
69 a0d146ed 2005-07-12 devnull p += U32Size;
70 a0d146ed 2005-07-12 devnull ap->blocksize = U32GET(p);
71 a0d146ed 2005-07-12 devnull p += U32Size;
72 a0d146ed 2005-07-12 devnull ap->arenabase = U32GET(p);
73 a0d146ed 2005-07-12 devnull p += U32Size;
75 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
76 a0d146ed 2005-07-12 devnull sysfatal("unpackarenapart unpacked wrong amount");
78 a0d146ed 2005-07-12 devnull return 0;
82 a0d146ed 2005-07-12 devnull packarenapart(ArenaPart *ap, u8int *buf)
84 a0d146ed 2005-07-12 devnull u8int *p;
88 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaPartMagic);
89 a0d146ed 2005-07-12 devnull p += U32Size;
90 a0d146ed 2005-07-12 devnull U32PUT(p, ap->version);
91 a0d146ed 2005-07-12 devnull p += U32Size;
92 a0d146ed 2005-07-12 devnull U32PUT(p, ap->blocksize);
93 a0d146ed 2005-07-12 devnull p += U32Size;
94 a0d146ed 2005-07-12 devnull U32PUT(p, ap->arenabase);
95 a0d146ed 2005-07-12 devnull p += U32Size;
97 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
98 a0d146ed 2005-07-12 devnull sysfatal("packarenapart packed wrong amount");
100 a0d146ed 2005-07-12 devnull return 0;
104 a0d146ed 2005-07-12 devnull unpackarena(Arena *arena, u8int *buf)
107 a0d146ed 2005-07-12 devnull u8int *p;
108 a0d146ed 2005-07-12 devnull u32int m;
109 a0d146ed 2005-07-12 devnull char fbuf[20];
111 a0d146ed 2005-07-12 devnull p = buf;
113 a0d146ed 2005-07-12 devnull m = U32GET(p);
114 a0d146ed 2005-07-12 devnull if(m != ArenaMagic){
115 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena has wrong magic number: %s expected ArenaMagic (%lux)", fmtmagic(fbuf, m), ArenaMagic);
116 a0d146ed 2005-07-12 devnull return -1;
118 a0d146ed 2005-07-12 devnull p += U32Size;
119 a0d146ed 2005-07-12 devnull arena->version = U32GET(p);
120 a0d146ed 2005-07-12 devnull p += U32Size;
121 a0d146ed 2005-07-12 devnull namecp(arena->name, (char*)p);
122 a0d146ed 2005-07-12 devnull p += ANameSize;
123 a0d146ed 2005-07-12 devnull arena->diskstats.clumps = U32GET(p);
124 a0d146ed 2005-07-12 devnull p += U32Size;
125 a0d146ed 2005-07-12 devnull arena->diskstats.cclumps = U32GET(p);
126 a0d146ed 2005-07-12 devnull p += U32Size;
127 a0d146ed 2005-07-12 devnull arena->ctime = U32GET(p);
128 a0d146ed 2005-07-12 devnull p += U32Size;
129 a0d146ed 2005-07-12 devnull arena->wtime = U32GET(p);
130 a0d146ed 2005-07-12 devnull p += U32Size;
131 a0d146ed 2005-07-12 devnull if(arena->version == ArenaVersion5){
132 a0d146ed 2005-07-12 devnull arena->clumpmagic = U32GET(p);
133 a0d146ed 2005-07-12 devnull p += U32Size;
135 a0d146ed 2005-07-12 devnull arena->diskstats.used = U64GET(p);
136 a0d146ed 2005-07-12 devnull p += U64Size;
137 a0d146ed 2005-07-12 devnull arena->diskstats.uncsize = U64GET(p);
138 a0d146ed 2005-07-12 devnull p += U64Size;
139 a0d146ed 2005-07-12 devnull arena->diskstats.sealed = U8GET(p);
140 a0d146ed 2005-07-12 devnull p += U8Size;
142 a0d146ed 2005-07-12 devnull arena->memstats = arena->diskstats;
144 a0d146ed 2005-07-12 devnull switch(arena->version){
145 a0d146ed 2005-07-12 devnull case ArenaVersion4:
146 a0d146ed 2005-07-12 devnull sz = ArenaSize4;
147 a0d146ed 2005-07-12 devnull arena->clumpmagic = _ClumpMagic;
149 a0d146ed 2005-07-12 devnull case ArenaVersion5:
150 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
152 a0d146ed 2005-07-12 devnull default:
153 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena has bad version number %d", arena->version);
154 a0d146ed 2005-07-12 devnull return -1;
156 a0d146ed 2005-07-12 devnull if(buf + sz != p)
157 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
159 a0d146ed 2005-07-12 devnull return 0;
163 a0d146ed 2005-07-12 devnull packarena(Arena *arena, u8int *buf)
166 a0d146ed 2005-07-12 devnull u8int *p;
167 a0d146ed 2005-07-12 devnull u32int t32;
169 a0d146ed 2005-07-12 devnull switch(arena->version){
170 a0d146ed 2005-07-12 devnull case ArenaVersion4:
171 a0d146ed 2005-07-12 devnull sz = ArenaSize4;
172 a0d146ed 2005-07-12 devnull if(arena->clumpmagic != _ClumpMagic)
173 a0d146ed 2005-07-12 devnull fprint(2, "warning: writing old arena tail loses clump magic 0x%lux != 0x%lux\n",
174 a0d146ed 2005-07-12 devnull (ulong)arena->clumpmagic, (ulong)_ClumpMagic);
176 a0d146ed 2005-07-12 devnull case ArenaVersion5:
177 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
179 a0d146ed 2005-07-12 devnull default:
180 a0d146ed 2005-07-12 devnull sysfatal("packarena unknown version %d", arena->version);
181 a0d146ed 2005-07-12 devnull return -1;
184 a0d146ed 2005-07-12 devnull p = buf;
186 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaMagic);
187 a0d146ed 2005-07-12 devnull p += U32Size;
188 a0d146ed 2005-07-12 devnull U32PUT(p, arena->version);
189 a0d146ed 2005-07-12 devnull p += U32Size;
190 a0d146ed 2005-07-12 devnull namecp((char*)p, arena->name);
191 a0d146ed 2005-07-12 devnull p += ANameSize;
192 a0d146ed 2005-07-12 devnull U32PUT(p, arena->diskstats.clumps);
193 a0d146ed 2005-07-12 devnull p += U32Size;
194 a0d146ed 2005-07-12 devnull U32PUT(p, arena->diskstats.cclumps);
195 a0d146ed 2005-07-12 devnull p += U32Size;
196 a0d146ed 2005-07-12 devnull U32PUT(p, arena->ctime);
197 a0d146ed 2005-07-12 devnull p += U32Size;
198 a0d146ed 2005-07-12 devnull U32PUT(p, arena->wtime);
199 a0d146ed 2005-07-12 devnull p += U32Size;
200 a0d146ed 2005-07-12 devnull if(arena->version == ArenaVersion5){
201 a0d146ed 2005-07-12 devnull U32PUT(p, arena->clumpmagic);
202 a0d146ed 2005-07-12 devnull p += U32Size;
204 a0d146ed 2005-07-12 devnull U64PUT(p, arena->diskstats.used, t32);
205 a0d146ed 2005-07-12 devnull p += U64Size;
206 a0d146ed 2005-07-12 devnull U64PUT(p, arena->diskstats.uncsize, t32);
207 a0d146ed 2005-07-12 devnull p += U64Size;
208 a0d146ed 2005-07-12 devnull U8PUT(p, arena->diskstats.sealed);
209 a0d146ed 2005-07-12 devnull p += U8Size;
211 a0d146ed 2005-07-12 devnull if(buf + sz != p)
212 a0d146ed 2005-07-12 devnull sysfatal("packarena packed wrong amount");
214 a0d146ed 2005-07-12 devnull return 0;
218 a0d146ed 2005-07-12 devnull unpackarenahead(ArenaHead *head, u8int *buf)
220 a0d146ed 2005-07-12 devnull u8int *p;
221 a0d146ed 2005-07-12 devnull u32int m;
224 a0d146ed 2005-07-12 devnull p = buf;
226 a0d146ed 2005-07-12 devnull m = U32GET(p);
227 a0d146ed 2005-07-12 devnull /* XXX check magic! */
229 a0d146ed 2005-07-12 devnull p += U32Size;
230 a0d146ed 2005-07-12 devnull head->version = U32GET(p);
231 a0d146ed 2005-07-12 devnull p += U32Size;
232 a0d146ed 2005-07-12 devnull namecp(head->name, (char*)p);
233 a0d146ed 2005-07-12 devnull p += ANameSize;
234 a0d146ed 2005-07-12 devnull head->blocksize = U32GET(p);
235 a0d146ed 2005-07-12 devnull p += U32Size;
236 a0d146ed 2005-07-12 devnull head->size = U64GET(p);
237 a0d146ed 2005-07-12 devnull p += U64Size;
238 a0d146ed 2005-07-12 devnull if(head->version == ArenaVersion5){
239 a0d146ed 2005-07-12 devnull head->clumpmagic = U32GET(p);
240 a0d146ed 2005-07-12 devnull p += U32Size;
243 a0d146ed 2005-07-12 devnull switch(head->version){
244 a0d146ed 2005-07-12 devnull case ArenaVersion4:
245 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize4;
246 a0d146ed 2005-07-12 devnull head->clumpmagic = _ClumpMagic;
248 a0d146ed 2005-07-12 devnull case ArenaVersion5:
249 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
251 a0d146ed 2005-07-12 devnull default:
252 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena head has unexpected version %d", head->version);
253 a0d146ed 2005-07-12 devnull return -1;
256 a0d146ed 2005-07-12 devnull if(buf + sz != p)
257 a0d146ed 2005-07-12 devnull sysfatal("unpackarenahead unpacked wrong amount");
259 a0d146ed 2005-07-12 devnull return 0;
263 a0d146ed 2005-07-12 devnull packarenahead(ArenaHead *head, u8int *buf)
265 a0d146ed 2005-07-12 devnull u8int *p;
267 a0d146ed 2005-07-12 devnull u32int t32;
269 a0d146ed 2005-07-12 devnull switch(head->version){
270 a0d146ed 2005-07-12 devnull case ArenaVersion4:
271 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize4;
272 a0d146ed 2005-07-12 devnull if(head->clumpmagic != _ClumpMagic)
273 a0d146ed 2005-07-12 devnull fprint(2, "warning: writing old arena header loses clump magic 0x%lux != 0x%lux\n",
274 a0d146ed 2005-07-12 devnull (ulong)head->clumpmagic, (ulong)_ClumpMagic);
276 a0d146ed 2005-07-12 devnull case ArenaVersion5:
277 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
279 a0d146ed 2005-07-12 devnull default:
280 a0d146ed 2005-07-12 devnull sysfatal("packarenahead unknown version %d", head->version);
281 a0d146ed 2005-07-12 devnull return -1;
284 a0d146ed 2005-07-12 devnull p = buf;
286 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaHeadMagic);
287 a0d146ed 2005-07-12 devnull p += U32Size;
288 a0d146ed 2005-07-12 devnull U32PUT(p, head->version);
289 a0d146ed 2005-07-12 devnull p += U32Size;
290 a0d146ed 2005-07-12 devnull namecp((char*)p, head->name);
291 a0d146ed 2005-07-12 devnull p += ANameSize;
292 a0d146ed 2005-07-12 devnull U32PUT(p, head->blocksize);
293 a0d146ed 2005-07-12 devnull p += U32Size;
294 a0d146ed 2005-07-12 devnull U64PUT(p, head->size, t32);
295 a0d146ed 2005-07-12 devnull p += U64Size;
296 a0d146ed 2005-07-12 devnull if(head->version == ArenaVersion5){
297 a0d146ed 2005-07-12 devnull U32PUT(p, head->clumpmagic);
298 a0d146ed 2005-07-12 devnull p += U32Size;
300 a0d146ed 2005-07-12 devnull if(buf + sz != p)
301 a0d146ed 2005-07-12 devnull sysfatal("packarenahead packed wrong amount");
303 a0d146ed 2005-07-12 devnull return 0;
306 a0d146ed 2005-07-12 devnull static int
307 a0d146ed 2005-07-12 devnull checkclump(Clump *w)
309 a0d146ed 2005-07-12 devnull if(w->encoding == ClumpENone){
310 a0d146ed 2005-07-12 devnull if(w->info.size != w->info.uncsize){
311 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "uncompressed wad size mismatch");
312 a0d146ed 2005-07-12 devnull return -1;
314 a0d146ed 2005-07-12 devnull }else if(w->encoding == ClumpECompress){
315 a0d146ed 2005-07-12 devnull if(w->info.size >= w->info.uncsize){
316 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "compressed lump has inconsistent block sizes %d %d", w->info.size, w->info.uncsize);
317 a0d146ed 2005-07-12 devnull return -1;
320 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has illegal encoding");
321 a0d146ed 2005-07-12 devnull return -1;
324 a0d146ed 2005-07-12 devnull return 0;
328 a0d146ed 2005-07-12 devnull unpackclump(Clump *c, u8int *buf, u32int cmagic)
330 a0d146ed 2005-07-12 devnull u8int *p;
331 a0d146ed 2005-07-12 devnull u32int magic;
333 a0d146ed 2005-07-12 devnull p = buf;
334 a0d146ed 2005-07-12 devnull magic = U32GET(p);
335 a0d146ed 2005-07-12 devnull if(magic != cmagic){
336 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has bad magic number=%#8.8ux != %#8.8ux", magic, cmagic);
337 a0d146ed 2005-07-12 devnull return -1;
339 a0d146ed 2005-07-12 devnull p += U32Size;
341 a0d146ed 2005-07-12 devnull c->info.type = vtfromdisktype(U8GET(p));
342 a0d146ed 2005-07-12 devnull p += U8Size;
343 a0d146ed 2005-07-12 devnull c->info.size = U16GET(p);
344 a0d146ed 2005-07-12 devnull p += U16Size;
345 a0d146ed 2005-07-12 devnull c->info.uncsize = U16GET(p);
346 a0d146ed 2005-07-12 devnull p += U16Size;
347 a0d146ed 2005-07-12 devnull scorecp(c->info.score, p);
348 a0d146ed 2005-07-12 devnull p += VtScoreSize;
350 a0d146ed 2005-07-12 devnull c->encoding = U8GET(p);
351 a0d146ed 2005-07-12 devnull p += U8Size;
352 a0d146ed 2005-07-12 devnull c->creator = U32GET(p);
353 a0d146ed 2005-07-12 devnull p += U32Size;
354 a0d146ed 2005-07-12 devnull c->time = U32GET(p);
355 a0d146ed 2005-07-12 devnull p += U32Size;
357 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
358 a0d146ed 2005-07-12 devnull sysfatal("unpackclump unpacked wrong amount");
360 a0d146ed 2005-07-12 devnull return checkclump(c);
364 a0d146ed 2005-07-12 devnull packclump(Clump *c, u8int *buf, u32int magic)
366 a0d146ed 2005-07-12 devnull u8int *p;
368 a0d146ed 2005-07-12 devnull p = buf;
369 a0d146ed 2005-07-12 devnull U32PUT(p, magic);
370 a0d146ed 2005-07-12 devnull p += U32Size;
372 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(c->info.type));
373 a0d146ed 2005-07-12 devnull p += U8Size;
374 a0d146ed 2005-07-12 devnull U16PUT(p, c->info.size);
375 a0d146ed 2005-07-12 devnull p += U16Size;
376 a0d146ed 2005-07-12 devnull U16PUT(p, c->info.uncsize);
377 a0d146ed 2005-07-12 devnull p += U16Size;
378 a0d146ed 2005-07-12 devnull scorecp(p, c->info.score);
379 a0d146ed 2005-07-12 devnull p += VtScoreSize;
381 a0d146ed 2005-07-12 devnull U8PUT(p, c->encoding);
382 a0d146ed 2005-07-12 devnull p += U8Size;
383 a0d146ed 2005-07-12 devnull U32PUT(p, c->creator);
384 a0d146ed 2005-07-12 devnull p += U32Size;
385 a0d146ed 2005-07-12 devnull U32PUT(p, c->time);
386 a0d146ed 2005-07-12 devnull p += U32Size;
388 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
389 a0d146ed 2005-07-12 devnull sysfatal("packclump packed wrong amount");
391 a0d146ed 2005-07-12 devnull return checkclump(c);
395 a0d146ed 2005-07-12 devnull unpackclumpinfo(ClumpInfo *ci, u8int *buf)
397 a0d146ed 2005-07-12 devnull u8int *p;
399 a0d146ed 2005-07-12 devnull p = buf;
400 a0d146ed 2005-07-12 devnull ci->type = vtfromdisktype(U8GET(p));
401 a0d146ed 2005-07-12 devnull p += U8Size;
402 a0d146ed 2005-07-12 devnull ci->size = U16GET(p);
403 a0d146ed 2005-07-12 devnull p += U16Size;
404 a0d146ed 2005-07-12 devnull ci->uncsize = U16GET(p);
405 a0d146ed 2005-07-12 devnull p += U16Size;
406 a0d146ed 2005-07-12 devnull scorecp(ci->score, p);
407 a0d146ed 2005-07-12 devnull p += VtScoreSize;
409 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
410 a0d146ed 2005-07-12 devnull sysfatal("unpackclumpinfo unpacked wrong amount");
414 a0d146ed 2005-07-12 devnull packclumpinfo(ClumpInfo *ci, u8int *buf)
416 a0d146ed 2005-07-12 devnull u8int *p;
418 a0d146ed 2005-07-12 devnull p = buf;
419 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(ci->type));
420 a0d146ed 2005-07-12 devnull p += U8Size;
421 a0d146ed 2005-07-12 devnull U16PUT(p, ci->size);
422 a0d146ed 2005-07-12 devnull p += U16Size;
423 a0d146ed 2005-07-12 devnull U16PUT(p, ci->uncsize);
424 a0d146ed 2005-07-12 devnull p += U16Size;
425 a0d146ed 2005-07-12 devnull scorecp(p, ci->score);
426 a0d146ed 2005-07-12 devnull p += VtScoreSize;
428 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
429 a0d146ed 2005-07-12 devnull sysfatal("packclumpinfo packed wrong amount");
433 a0d146ed 2005-07-12 devnull unpackisect(ISect *is, u8int *buf)
435 a0d146ed 2005-07-12 devnull u8int *p;
436 a0d146ed 2005-07-12 devnull u32int m;
437 a0d146ed 2005-07-12 devnull char fbuf[20];
439 a0d146ed 2005-07-12 devnull p = buf;
442 a0d146ed 2005-07-12 devnull m = U32GET(p);
443 a0d146ed 2005-07-12 devnull if(m != ISectMagic){
444 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "index section has wrong magic number: %s expected ISectMagic (%lux)",
445 a0d146ed 2005-07-12 devnull fmtmagic(fbuf, m), ISectMagic);
446 a0d146ed 2005-07-12 devnull return -1;
448 a0d146ed 2005-07-12 devnull p += U32Size;
449 a0d146ed 2005-07-12 devnull is->version = U32GET(p);
450 a0d146ed 2005-07-12 devnull p += U32Size;
451 a0d146ed 2005-07-12 devnull namecp(is->name, (char*)p);
452 a0d146ed 2005-07-12 devnull p += ANameSize;
453 a0d146ed 2005-07-12 devnull namecp(is->index, (char*)p);
454 a0d146ed 2005-07-12 devnull p += ANameSize;
455 a0d146ed 2005-07-12 devnull is->blocksize = U32GET(p);
456 a0d146ed 2005-07-12 devnull p += U32Size;
457 a0d146ed 2005-07-12 devnull is->blockbase = U32GET(p);
458 a0d146ed 2005-07-12 devnull p += U32Size;
459 a0d146ed 2005-07-12 devnull is->blocks = U32GET(p);
460 a0d146ed 2005-07-12 devnull p += U32Size;
461 a0d146ed 2005-07-12 devnull is->start = U32GET(p);
462 a0d146ed 2005-07-12 devnull p += U32Size;
463 a0d146ed 2005-07-12 devnull is->stop = U32GET(p);
464 a0d146ed 2005-07-12 devnull p += U32Size;
465 a0d146ed 2005-07-12 devnull if(buf + ISectSize1 != p)
466 a0d146ed 2005-07-12 devnull sysfatal("unpackisect unpacked wrong amount");
467 a0d146ed 2005-07-12 devnull is->bucketmagic = 0;
468 a0d146ed 2005-07-12 devnull if(is->version == ISectVersion2){
469 a0d146ed 2005-07-12 devnull is->bucketmagic = U32GET(p);
470 a0d146ed 2005-07-12 devnull p += U32Size;
471 a0d146ed 2005-07-12 devnull if(buf + ISectSize2 != p)
472 a0d146ed 2005-07-12 devnull sysfatal("unpackisect unpacked wrong amount");
475 a0d146ed 2005-07-12 devnull return 0;
479 a0d146ed 2005-07-12 devnull packisect(ISect *is, u8int *buf)
481 a0d146ed 2005-07-12 devnull u8int *p;
483 a0d146ed 2005-07-12 devnull p = buf;
485 a0d146ed 2005-07-12 devnull U32PUT(p, ISectMagic);
486 a0d146ed 2005-07-12 devnull p += U32Size;
487 a0d146ed 2005-07-12 devnull U32PUT(p, is->version);
488 a0d146ed 2005-07-12 devnull p += U32Size;
489 a0d146ed 2005-07-12 devnull namecp((char*)p, is->name);
490 a0d146ed 2005-07-12 devnull p += ANameSize;
491 a0d146ed 2005-07-12 devnull namecp((char*)p, is->index);
492 a0d146ed 2005-07-12 devnull p += ANameSize;
493 a0d146ed 2005-07-12 devnull U32PUT(p, is->blocksize);
494 a0d146ed 2005-07-12 devnull p += U32Size;
495 a0d146ed 2005-07-12 devnull U32PUT(p, is->blockbase);
496 a0d146ed 2005-07-12 devnull p += U32Size;
497 a0d146ed 2005-07-12 devnull U32PUT(p, is->blocks);
498 a0d146ed 2005-07-12 devnull p += U32Size;
499 a0d146ed 2005-07-12 devnull U32PUT(p, is->start);
500 a0d146ed 2005-07-12 devnull p += U32Size;
501 a0d146ed 2005-07-12 devnull U32PUT(p, is->stop);
502 a0d146ed 2005-07-12 devnull p += U32Size;
503 a0d146ed 2005-07-12 devnull if(buf + ISectSize1 != p)
504 a0d146ed 2005-07-12 devnull sysfatal("packisect packed wrong amount");
505 a0d146ed 2005-07-12 devnull if(is->version == ISectVersion2){
506 a0d146ed 2005-07-12 devnull U32PUT(p, is->bucketmagic);
507 a0d146ed 2005-07-12 devnull p += U32Size;
508 a0d146ed 2005-07-12 devnull if(buf + ISectSize2 != p)
509 a0d146ed 2005-07-12 devnull sysfatal("packisect packed wrong amount");
512 a0d146ed 2005-07-12 devnull return 0;
516 a0d146ed 2005-07-12 devnull unpackientry(IEntry *ie, u8int *buf)
518 a0d146ed 2005-07-12 devnull u8int *p;
520 a0d146ed 2005-07-12 devnull p = buf;
522 a0d146ed 2005-07-12 devnull scorecp(ie->score, p);
523 a0d146ed 2005-07-12 devnull p += VtScoreSize;
524 a0d146ed 2005-07-12 devnull ie->wtime = U32GET(p);
525 a0d146ed 2005-07-12 devnull p += U32Size;
526 a0d146ed 2005-07-12 devnull ie->train = U16GET(p);
527 a0d146ed 2005-07-12 devnull p += U16Size;
528 a0d146ed 2005-07-12 devnull ie->ia.addr = U64GET(p);
529 a0d146ed 2005-07-12 devnull if(ie->ia.addr>>56) print("%.8H => %llux\n", p, ie->ia.addr);
530 a0d146ed 2005-07-12 devnull p += U64Size;
531 a0d146ed 2005-07-12 devnull ie->ia.size = U16GET(p);
532 a0d146ed 2005-07-12 devnull p += U16Size;
533 a0d146ed 2005-07-12 devnull if(p - buf != IEntryTypeOff)
534 a0d146ed 2005-07-12 devnull sysfatal("unpackientry bad IEntryTypeOff amount");
535 a0d146ed 2005-07-12 devnull ie->ia.type = vtfromdisktype(U8GET(p));
536 a0d146ed 2005-07-12 devnull p += U8Size;
537 a0d146ed 2005-07-12 devnull ie->ia.blocks = U8GET(p);
538 a0d146ed 2005-07-12 devnull p += U8Size;
540 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
541 a0d146ed 2005-07-12 devnull sysfatal("unpackientry unpacked wrong amount");
545 a0d146ed 2005-07-12 devnull packientry(IEntry *ie, u8int *buf)
547 a0d146ed 2005-07-12 devnull u32int t32;
548 a0d146ed 2005-07-12 devnull u8int *p;
550 a0d146ed 2005-07-12 devnull p = buf;
552 a0d146ed 2005-07-12 devnull scorecp(p, ie->score);
553 a0d146ed 2005-07-12 devnull p += VtScoreSize;
554 a0d146ed 2005-07-12 devnull U32PUT(p, ie->wtime);
555 a0d146ed 2005-07-12 devnull p += U32Size;
556 a0d146ed 2005-07-12 devnull U16PUT(p, ie->train);
557 a0d146ed 2005-07-12 devnull p += U16Size;
558 a0d146ed 2005-07-12 devnull U64PUT(p, ie->ia.addr, t32);
559 a0d146ed 2005-07-12 devnull p += U64Size;
560 a0d146ed 2005-07-12 devnull U16PUT(p, ie->ia.size);
561 a0d146ed 2005-07-12 devnull p += U16Size;
562 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(ie->ia.type));
563 a0d146ed 2005-07-12 devnull p += U8Size;
564 a0d146ed 2005-07-12 devnull U8PUT(p, ie->ia.blocks);
565 a0d146ed 2005-07-12 devnull p += U8Size;
567 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
568 a0d146ed 2005-07-12 devnull sysfatal("packientry packed wrong amount");
572 a0d146ed 2005-07-12 devnull unpackibucket(IBucket *b, u8int *buf, u32int magic)
574 a0d146ed 2005-07-12 devnull b->n = U16GET(buf);
575 a0d146ed 2005-07-12 devnull b->data = buf + IBucketSize;
576 a0d146ed 2005-07-12 devnull if(magic && magic != U32GET(buf+U16Size))
577 a0d146ed 2005-07-12 devnull b->n = 0;
581 a0d146ed 2005-07-12 devnull packibucket(IBucket *b, u8int *buf, u32int magic)
583 a0d146ed 2005-07-12 devnull U16PUT(buf, b->n);
584 a0d146ed 2005-07-12 devnull U32PUT(buf+U16Size, magic);
588 a0d146ed 2005-07-12 devnull packbloomhead(Bloom *b, u8int *buf)
590 a0d146ed 2005-07-12 devnull u8int *p;
592 a0d146ed 2005-07-12 devnull p = buf;
593 a0d146ed 2005-07-12 devnull U32PUT(p, BloomMagic);
594 a0d146ed 2005-07-12 devnull U32PUT(p+4, BloomVersion);
595 a0d146ed 2005-07-12 devnull U32PUT(p+8, b->nhash);
596 a0d146ed 2005-07-12 devnull U32PUT(p+12, b->size);
600 a0d146ed 2005-07-12 devnull unpackbloomhead(Bloom *b, u8int *buf)
602 a0d146ed 2005-07-12 devnull u8int *p;
603 a0d146ed 2005-07-12 devnull u32int m;
604 a0d146ed 2005-07-12 devnull char fbuf[20];
606 a0d146ed 2005-07-12 devnull p = buf;
608 a0d146ed 2005-07-12 devnull m = U32GET(p);
609 a0d146ed 2005-07-12 devnull if(m != BloomMagic){
610 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "bloom filter has wrong magic number: %s expected BloomMagic (%lux)", fmtmagic(fbuf, m), (ulong)BloomMagic);
611 a0d146ed 2005-07-12 devnull return -1;
613 a0d146ed 2005-07-12 devnull p += U32Size;
615 a0d146ed 2005-07-12 devnull m = U32GET(p);
616 a0d146ed 2005-07-12 devnull if(m != BloomVersion){
617 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "bloom filter has wrong version %ud expected %ud", (uint)m, (uint)BloomVersion);
618 a0d146ed 2005-07-12 devnull return -1;
620 a0d146ed 2005-07-12 devnull p += U32Size;
622 a0d146ed 2005-07-12 devnull b->nhash = U32GET(p);
623 a0d146ed 2005-07-12 devnull p += U32Size;
625 a0d146ed 2005-07-12 devnull b->size = U32GET(p);
626 a0d146ed 2005-07-12 devnull p += U32Size;
628 a0d146ed 2005-07-12 devnull if(buf + BloomHeadSize != p)
629 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
631 a0d146ed 2005-07-12 devnull return 0;