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 f5a8ea6f 2011-06-02 rsc int debugarena = -1; /* hack to improve error reporting */
20 a0d146ed 2005-07-12 devnull static struct {
21 a0d146ed 2005-07-12 devnull u32int m;
23 a0d146ed 2005-07-12 devnull } magics[] = {
24 a0d146ed 2005-07-12 devnull ArenaPartMagic, "ArenaPartMagic",
25 a0d146ed 2005-07-12 devnull ArenaHeadMagic, "ArenaHeadMagic",
26 a0d146ed 2005-07-12 devnull ArenaMagic, "ArenaMagic",
27 a0d146ed 2005-07-12 devnull ISectMagic, "ISectMagic",
28 28b49df3 2006-07-18 devnull BloomMagic, "BloomMagic",
31 a0d146ed 2005-07-12 devnull static char*
32 a0d146ed 2005-07-12 devnull fmtmagic(char *s, u32int m)
36 a0d146ed 2005-07-12 devnull for(i=0; i<nelem(magics); i++)
37 a0d146ed 2005-07-12 devnull if(magics[i].m == m)
38 a0d146ed 2005-07-12 devnull return magics[i].s;
39 27d28098 2007-04-21 devnull sprint(s, "%#08ux", m);
40 a0d146ed 2005-07-12 devnull return s;
44 a0d146ed 2005-07-12 devnull unpackmagic(u8int *buf)
46 a0d146ed 2005-07-12 devnull return U32GET(buf);
50 a0d146ed 2005-07-12 devnull packmagic(u32int magic, u8int *buf)
52 a0d146ed 2005-07-12 devnull U32PUT(buf, magic);
56 a0d146ed 2005-07-12 devnull unpackarenapart(ArenaPart *ap, u8int *buf)
58 a0d146ed 2005-07-12 devnull u8int *p;
59 a0d146ed 2005-07-12 devnull u32int m;
60 a0d146ed 2005-07-12 devnull char fbuf[20];
64 a0d146ed 2005-07-12 devnull m = U32GET(p);
65 a0d146ed 2005-07-12 devnull if(m != ArenaPartMagic){
66 27d28098 2007-04-21 devnull seterr(ECorrupt, "arena set has wrong magic number: %s expected ArenaPartMagic (%#lux)", fmtmagic(fbuf, m), ArenaPartMagic);
67 a0d146ed 2005-07-12 devnull return -1;
69 a0d146ed 2005-07-12 devnull p += U32Size;
70 a0d146ed 2005-07-12 devnull ap->version = U32GET(p);
71 a0d146ed 2005-07-12 devnull p += U32Size;
72 a0d146ed 2005-07-12 devnull ap->blocksize = U32GET(p);
73 a0d146ed 2005-07-12 devnull p += U32Size;
74 a0d146ed 2005-07-12 devnull ap->arenabase = U32GET(p);
75 a0d146ed 2005-07-12 devnull p += U32Size;
77 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
78 a0d146ed 2005-07-12 devnull sysfatal("unpackarenapart unpacked wrong amount");
80 a0d146ed 2005-07-12 devnull return 0;
84 a0d146ed 2005-07-12 devnull packarenapart(ArenaPart *ap, u8int *buf)
86 a0d146ed 2005-07-12 devnull u8int *p;
90 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaPartMagic);
91 a0d146ed 2005-07-12 devnull p += U32Size;
92 a0d146ed 2005-07-12 devnull U32PUT(p, ap->version);
93 a0d146ed 2005-07-12 devnull p += U32Size;
94 a0d146ed 2005-07-12 devnull U32PUT(p, ap->blocksize);
95 a0d146ed 2005-07-12 devnull p += U32Size;
96 a0d146ed 2005-07-12 devnull U32PUT(p, ap->arenabase);
97 a0d146ed 2005-07-12 devnull p += U32Size;
99 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
100 a0d146ed 2005-07-12 devnull sysfatal("packarenapart packed wrong amount");
102 a0d146ed 2005-07-12 devnull return 0;
106 a0d146ed 2005-07-12 devnull unpackarena(Arena *arena, u8int *buf)
109 a0d146ed 2005-07-12 devnull u8int *p;
110 a0d146ed 2005-07-12 devnull u32int m;
111 a0d146ed 2005-07-12 devnull char fbuf[20];
113 a0d146ed 2005-07-12 devnull p = buf;
115 a0d146ed 2005-07-12 devnull m = U32GET(p);
116 a0d146ed 2005-07-12 devnull if(m != ArenaMagic){
117 f5a8ea6f 2011-06-02 rsc seterr(ECorrupt, "arena %d has wrong magic number: %s "
118 f5a8ea6f 2011-06-02 rsc "expected ArenaMagic (%#lux)", debugarena,
119 f5a8ea6f 2011-06-02 rsc fmtmagic(fbuf, m), ArenaMagic);
120 a0d146ed 2005-07-12 devnull return -1;
122 a0d146ed 2005-07-12 devnull p += U32Size;
123 a0d146ed 2005-07-12 devnull arena->version = U32GET(p);
124 a0d146ed 2005-07-12 devnull p += U32Size;
125 a0d146ed 2005-07-12 devnull namecp(arena->name, (char*)p);
126 a0d146ed 2005-07-12 devnull p += ANameSize;
127 a0d146ed 2005-07-12 devnull arena->diskstats.clumps = U32GET(p);
128 a0d146ed 2005-07-12 devnull p += U32Size;
129 a0d146ed 2005-07-12 devnull arena->diskstats.cclumps = U32GET(p);
130 a0d146ed 2005-07-12 devnull p += U32Size;
131 a0d146ed 2005-07-12 devnull arena->ctime = U32GET(p);
132 a0d146ed 2005-07-12 devnull p += U32Size;
133 a0d146ed 2005-07-12 devnull arena->wtime = U32GET(p);
134 a0d146ed 2005-07-12 devnull p += U32Size;
135 a0d146ed 2005-07-12 devnull if(arena->version == ArenaVersion5){
136 a0d146ed 2005-07-12 devnull arena->clumpmagic = U32GET(p);
137 a0d146ed 2005-07-12 devnull p += U32Size;
139 a0d146ed 2005-07-12 devnull arena->diskstats.used = U64GET(p);
140 a0d146ed 2005-07-12 devnull p += U64Size;
141 a0d146ed 2005-07-12 devnull arena->diskstats.uncsize = U64GET(p);
142 a0d146ed 2005-07-12 devnull p += U64Size;
143 a0d146ed 2005-07-12 devnull arena->diskstats.sealed = U8GET(p);
144 a0d146ed 2005-07-12 devnull p += U8Size;
145 a0d146ed 2005-07-12 devnull switch(arena->version){
146 a0d146ed 2005-07-12 devnull case ArenaVersion4:
147 a0d146ed 2005-07-12 devnull sz = ArenaSize4;
148 a0d146ed 2005-07-12 devnull arena->clumpmagic = _ClumpMagic;
150 a0d146ed 2005-07-12 devnull case ArenaVersion5:
151 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
153 a0d146ed 2005-07-12 devnull default:
154 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena has bad version number %d", arena->version);
155 a0d146ed 2005-07-12 devnull return -1;
158 28b49df3 2006-07-18 devnull * Additional fields for the memstats version of the stats.
159 28b49df3 2006-07-18 devnull * Diskstats reflects what is committed to the index.
160 28b49df3 2006-07-18 devnull * Memstats reflects what is in the arena. Originally intended
161 28b49df3 2006-07-18 devnull * this to be a version 5 extension, but might as well use for
162 28b49df3 2006-07-18 devnull * all the existing version 4 arenas too.
164 28b49df3 2006-07-18 devnull * To maintain backwards compatibility with existing venti
165 fa325e9b 2020-01-10 cross * installations using the older format, we define that if
166 28b49df3 2006-07-18 devnull * memstats == diskstats, then the extension fields are not
167 28b49df3 2006-07-18 devnull * included (see packarena below). That is, only partially
168 28b49df3 2006-07-18 devnull * indexed arenas have these fields. Fully indexed arenas
169 28b49df3 2006-07-18 devnull * (in particular, sealed arenas) do not.
171 28b49df3 2006-07-18 devnull if(U8GET(p) == 1){
172 28b49df3 2006-07-18 devnull sz += ArenaSize5a-ArenaSize5;
173 28b49df3 2006-07-18 devnull p += U8Size;
174 28b49df3 2006-07-18 devnull arena->memstats.clumps = U32GET(p);
175 28b49df3 2006-07-18 devnull p += U32Size;
176 28b49df3 2006-07-18 devnull arena->memstats.cclumps = U32GET(p);
177 28b49df3 2006-07-18 devnull p += U32Size;
178 28b49df3 2006-07-18 devnull arena->memstats.used = U64GET(p);
179 28b49df3 2006-07-18 devnull p += U64Size;
180 28b49df3 2006-07-18 devnull arena->memstats.uncsize = U64GET(p);
181 28b49df3 2006-07-18 devnull p += U64Size;
182 28b49df3 2006-07-18 devnull arena->memstats.sealed = U8GET(p);
183 28b49df3 2006-07-18 devnull p += U8Size;
187 9f8a101a 2008-04-16 rsc * Packarena (below) used to have a bug in which it would
188 9f8a101a 2008-04-16 rsc * not zero out any existing extension fields when writing
189 9f8a101a 2008-04-16 rsc * the arena metadata. This would manifest itself as arenas
190 9f8a101a 2008-04-16 rsc * with arena->diskstats.sealed == 1 but arena->memstats.sealed == 0
191 9f8a101a 2008-04-16 rsc * after a server restart. Because arena->memstats.sealed wouldn't
192 9f8a101a 2008-04-16 rsc * be set, the server might try to fit another block into the arena
193 9f8a101a 2008-04-16 rsc * (and succeed), violating the append-only structure of the log
194 9f8a101a 2008-04-16 rsc * and invalidating any already-computed seal on the arena.
196 9f8a101a 2008-04-16 rsc * It might end up that other fields in arena->memstats end up
197 9f8a101a 2008-04-16 rsc * behind arena->diskstats too, but that would be considerably
198 9f8a101a 2008-04-16 rsc * more rare, and the bug is fixed now. The case we need to
199 9f8a101a 2008-04-16 rsc * handle is just the sealed mismatch.
201 9f8a101a 2008-04-16 rsc * If we encounter such a bogus arena, fix the sealed field.
203 9f8a101a 2008-04-16 rsc if(arena->diskstats.sealed)
204 9f8a101a 2008-04-16 rsc arena->memstats.sealed = 1;
206 28b49df3 2006-07-18 devnull arena->memstats = arena->diskstats;
207 a0d146ed 2005-07-12 devnull if(buf + sz != p)
208 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
210 a0d146ed 2005-07-12 devnull return 0;
214 a0d146ed 2005-07-12 devnull packarena(Arena *arena, u8int *buf)
216 28b49df3 2006-07-18 devnull return _packarena(arena, buf, 0);
220 28b49df3 2006-07-18 devnull _packarena(Arena *arena, u8int *buf, int forceext)
223 a0d146ed 2005-07-12 devnull u8int *p;
224 a0d146ed 2005-07-12 devnull u32int t32;
226 a0d146ed 2005-07-12 devnull switch(arena->version){
227 a0d146ed 2005-07-12 devnull case ArenaVersion4:
228 a0d146ed 2005-07-12 devnull sz = ArenaSize4;
229 a0d146ed 2005-07-12 devnull if(arena->clumpmagic != _ClumpMagic)
230 a0d146ed 2005-07-12 devnull fprint(2, "warning: writing old arena tail loses clump magic 0x%lux != 0x%lux\n",
231 a0d146ed 2005-07-12 devnull (ulong)arena->clumpmagic, (ulong)_ClumpMagic);
233 a0d146ed 2005-07-12 devnull case ArenaVersion5:
234 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
236 a0d146ed 2005-07-12 devnull default:
237 a0d146ed 2005-07-12 devnull sysfatal("packarena unknown version %d", arena->version);
238 a0d146ed 2005-07-12 devnull return -1;
241 a0d146ed 2005-07-12 devnull p = buf;
243 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaMagic);
244 a0d146ed 2005-07-12 devnull p += U32Size;
245 a0d146ed 2005-07-12 devnull U32PUT(p, arena->version);
246 a0d146ed 2005-07-12 devnull p += U32Size;
247 a0d146ed 2005-07-12 devnull namecp((char*)p, arena->name);
248 a0d146ed 2005-07-12 devnull p += ANameSize;
249 a0d146ed 2005-07-12 devnull U32PUT(p, arena->diskstats.clumps);
250 a0d146ed 2005-07-12 devnull p += U32Size;
251 a0d146ed 2005-07-12 devnull U32PUT(p, arena->diskstats.cclumps);
252 a0d146ed 2005-07-12 devnull p += U32Size;
253 a0d146ed 2005-07-12 devnull U32PUT(p, arena->ctime);
254 a0d146ed 2005-07-12 devnull p += U32Size;
255 a0d146ed 2005-07-12 devnull U32PUT(p, arena->wtime);
256 a0d146ed 2005-07-12 devnull p += U32Size;
257 a0d146ed 2005-07-12 devnull if(arena->version == ArenaVersion5){
258 a0d146ed 2005-07-12 devnull U32PUT(p, arena->clumpmagic);
259 a0d146ed 2005-07-12 devnull p += U32Size;
261 a0d146ed 2005-07-12 devnull U64PUT(p, arena->diskstats.used, t32);
262 a0d146ed 2005-07-12 devnull p += U64Size;
263 a0d146ed 2005-07-12 devnull U64PUT(p, arena->diskstats.uncsize, t32);
264 a0d146ed 2005-07-12 devnull p += U64Size;
265 a0d146ed 2005-07-12 devnull U8PUT(p, arena->diskstats.sealed);
266 a0d146ed 2005-07-12 devnull p += U8Size;
269 28b49df3 2006-07-18 devnull * Extension fields; see above.
271 28b49df3 2006-07-18 devnull if(forceext
272 28b49df3 2006-07-18 devnull || arena->memstats.clumps != arena->diskstats.clumps
273 28b49df3 2006-07-18 devnull || arena->memstats.cclumps != arena->diskstats.cclumps
274 28b49df3 2006-07-18 devnull || arena->memstats.used != arena->diskstats.used
275 28b49df3 2006-07-18 devnull || arena->memstats.uncsize != arena->diskstats.uncsize
276 28b49df3 2006-07-18 devnull || arena->memstats.sealed != arena->diskstats.sealed){
277 28b49df3 2006-07-18 devnull sz += ArenaSize5a - ArenaSize5;
278 28b49df3 2006-07-18 devnull U8PUT(p, 1);
279 28b49df3 2006-07-18 devnull p += U8Size;
280 28b49df3 2006-07-18 devnull U32PUT(p, arena->memstats.clumps);
281 28b49df3 2006-07-18 devnull p += U32Size;
282 28b49df3 2006-07-18 devnull U32PUT(p, arena->memstats.cclumps);
283 28b49df3 2006-07-18 devnull p += U32Size;
284 fa325e9b 2020-01-10 cross U64PUT(p, arena->memstats.used, t32);
285 28b49df3 2006-07-18 devnull p += U64Size;
286 28b49df3 2006-07-18 devnull U64PUT(p, arena->memstats.uncsize, t32);
287 28b49df3 2006-07-18 devnull p += U64Size;
288 28b49df3 2006-07-18 devnull U8PUT(p, arena->memstats.sealed);
289 28b49df3 2006-07-18 devnull p += U8Size;
291 9f8a101a 2008-04-16 rsc /* Clear any extension fields already on disk. */
292 9f8a101a 2008-04-16 rsc memset(p, 0, ArenaSize5a - ArenaSize5);
293 9f8a101a 2008-04-16 rsc p += ArenaSize5a - ArenaSize5;
294 9f8a101a 2008-04-16 rsc sz += ArenaSize5a - ArenaSize5;
297 a0d146ed 2005-07-12 devnull if(buf + sz != p)
298 a0d146ed 2005-07-12 devnull sysfatal("packarena packed wrong amount");
300 a0d146ed 2005-07-12 devnull return 0;
304 a0d146ed 2005-07-12 devnull unpackarenahead(ArenaHead *head, u8int *buf)
306 a0d146ed 2005-07-12 devnull u8int *p;
307 a0d146ed 2005-07-12 devnull u32int m;
309 27d28098 2007-04-21 devnull char fbuf[20];
311 a0d146ed 2005-07-12 devnull p = buf;
313 a0d146ed 2005-07-12 devnull m = U32GET(p);
314 27d28098 2007-04-21 devnull if(m != ArenaHeadMagic){
315 f5a8ea6f 2011-06-02 rsc seterr(ECorrupt, "arena %d head has wrong magic number: %s "
316 f5a8ea6f 2011-06-02 rsc "expected ArenaHeadMagic (%#lux)", debugarena,
317 f5a8ea6f 2011-06-02 rsc fmtmagic(fbuf, m), ArenaHeadMagic);
318 27d28098 2007-04-21 devnull return -1;
321 a0d146ed 2005-07-12 devnull p += U32Size;
322 a0d146ed 2005-07-12 devnull head->version = U32GET(p);
323 a0d146ed 2005-07-12 devnull p += U32Size;
324 a0d146ed 2005-07-12 devnull namecp(head->name, (char*)p);
325 a0d146ed 2005-07-12 devnull p += ANameSize;
326 a0d146ed 2005-07-12 devnull head->blocksize = U32GET(p);
327 a0d146ed 2005-07-12 devnull p += U32Size;
328 a0d146ed 2005-07-12 devnull head->size = U64GET(p);
329 a0d146ed 2005-07-12 devnull p += U64Size;
330 a0d146ed 2005-07-12 devnull if(head->version == ArenaVersion5){
331 a0d146ed 2005-07-12 devnull head->clumpmagic = U32GET(p);
332 a0d146ed 2005-07-12 devnull p += U32Size;
335 a0d146ed 2005-07-12 devnull switch(head->version){
336 a0d146ed 2005-07-12 devnull case ArenaVersion4:
337 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize4;
338 a0d146ed 2005-07-12 devnull head->clumpmagic = _ClumpMagic;
340 a0d146ed 2005-07-12 devnull case ArenaVersion5:
341 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
343 a0d146ed 2005-07-12 devnull default:
344 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena head has unexpected version %d", head->version);
345 a0d146ed 2005-07-12 devnull return -1;
348 a0d146ed 2005-07-12 devnull if(buf + sz != p)
349 a0d146ed 2005-07-12 devnull sysfatal("unpackarenahead unpacked wrong amount");
351 a0d146ed 2005-07-12 devnull return 0;
355 a0d146ed 2005-07-12 devnull packarenahead(ArenaHead *head, u8int *buf)
357 a0d146ed 2005-07-12 devnull u8int *p;
359 a0d146ed 2005-07-12 devnull u32int t32;
361 a0d146ed 2005-07-12 devnull switch(head->version){
362 a0d146ed 2005-07-12 devnull case ArenaVersion4:
363 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize4;
364 a0d146ed 2005-07-12 devnull if(head->clumpmagic != _ClumpMagic)
365 a0d146ed 2005-07-12 devnull fprint(2, "warning: writing old arena header loses clump magic 0x%lux != 0x%lux\n",
366 a0d146ed 2005-07-12 devnull (ulong)head->clumpmagic, (ulong)_ClumpMagic);
368 a0d146ed 2005-07-12 devnull case ArenaVersion5:
369 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
371 a0d146ed 2005-07-12 devnull default:
372 a0d146ed 2005-07-12 devnull sysfatal("packarenahead unknown version %d", head->version);
373 a0d146ed 2005-07-12 devnull return -1;
376 a0d146ed 2005-07-12 devnull p = buf;
378 a0d146ed 2005-07-12 devnull U32PUT(p, ArenaHeadMagic);
379 a0d146ed 2005-07-12 devnull p += U32Size;
380 a0d146ed 2005-07-12 devnull U32PUT(p, head->version);
381 a0d146ed 2005-07-12 devnull p += U32Size;
382 a0d146ed 2005-07-12 devnull namecp((char*)p, head->name);
383 a0d146ed 2005-07-12 devnull p += ANameSize;
384 a0d146ed 2005-07-12 devnull U32PUT(p, head->blocksize);
385 a0d146ed 2005-07-12 devnull p += U32Size;
386 a0d146ed 2005-07-12 devnull U64PUT(p, head->size, t32);
387 a0d146ed 2005-07-12 devnull p += U64Size;
388 a0d146ed 2005-07-12 devnull if(head->version == ArenaVersion5){
389 a0d146ed 2005-07-12 devnull U32PUT(p, head->clumpmagic);
390 a0d146ed 2005-07-12 devnull p += U32Size;
392 a0d146ed 2005-07-12 devnull if(buf + sz != p)
393 a0d146ed 2005-07-12 devnull sysfatal("packarenahead packed wrong amount");
395 a0d146ed 2005-07-12 devnull return 0;
398 a0d146ed 2005-07-12 devnull static int
399 a0d146ed 2005-07-12 devnull checkclump(Clump *w)
401 a0d146ed 2005-07-12 devnull if(w->encoding == ClumpENone){
402 a0d146ed 2005-07-12 devnull if(w->info.size != w->info.uncsize){
403 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "uncompressed wad size mismatch");
404 a0d146ed 2005-07-12 devnull return -1;
406 a0d146ed 2005-07-12 devnull }else if(w->encoding == ClumpECompress){
407 a0d146ed 2005-07-12 devnull if(w->info.size >= w->info.uncsize){
408 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "compressed lump has inconsistent block sizes %d %d", w->info.size, w->info.uncsize);
409 a0d146ed 2005-07-12 devnull return -1;
412 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has illegal encoding");
413 a0d146ed 2005-07-12 devnull return -1;
416 a0d146ed 2005-07-12 devnull return 0;
420 a0d146ed 2005-07-12 devnull unpackclump(Clump *c, u8int *buf, u32int cmagic)
422 a0d146ed 2005-07-12 devnull u8int *p;
423 a0d146ed 2005-07-12 devnull u32int magic;
425 a0d146ed 2005-07-12 devnull p = buf;
426 a0d146ed 2005-07-12 devnull magic = U32GET(p);
427 a0d146ed 2005-07-12 devnull if(magic != cmagic){
428 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has bad magic number=%#8.8ux != %#8.8ux", magic, cmagic);
429 a0d146ed 2005-07-12 devnull return -1;
431 a0d146ed 2005-07-12 devnull p += U32Size;
433 a0d146ed 2005-07-12 devnull c->info.type = vtfromdisktype(U8GET(p));
434 a0d146ed 2005-07-12 devnull p += U8Size;
435 a0d146ed 2005-07-12 devnull c->info.size = U16GET(p);
436 a0d146ed 2005-07-12 devnull p += U16Size;
437 a0d146ed 2005-07-12 devnull c->info.uncsize = U16GET(p);
438 a0d146ed 2005-07-12 devnull p += U16Size;
439 a0d146ed 2005-07-12 devnull scorecp(c->info.score, p);
440 a0d146ed 2005-07-12 devnull p += VtScoreSize;
442 a0d146ed 2005-07-12 devnull c->encoding = U8GET(p);
443 a0d146ed 2005-07-12 devnull p += U8Size;
444 a0d146ed 2005-07-12 devnull c->creator = U32GET(p);
445 a0d146ed 2005-07-12 devnull p += U32Size;
446 a0d146ed 2005-07-12 devnull c->time = U32GET(p);
447 a0d146ed 2005-07-12 devnull p += U32Size;
449 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
450 a0d146ed 2005-07-12 devnull sysfatal("unpackclump unpacked wrong amount");
452 a0d146ed 2005-07-12 devnull return checkclump(c);
456 a0d146ed 2005-07-12 devnull packclump(Clump *c, u8int *buf, u32int magic)
458 a0d146ed 2005-07-12 devnull u8int *p;
460 a0d146ed 2005-07-12 devnull p = buf;
461 a0d146ed 2005-07-12 devnull U32PUT(p, magic);
462 a0d146ed 2005-07-12 devnull p += U32Size;
464 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(c->info.type));
465 a0d146ed 2005-07-12 devnull p += U8Size;
466 a0d146ed 2005-07-12 devnull U16PUT(p, c->info.size);
467 a0d146ed 2005-07-12 devnull p += U16Size;
468 a0d146ed 2005-07-12 devnull U16PUT(p, c->info.uncsize);
469 a0d146ed 2005-07-12 devnull p += U16Size;
470 a0d146ed 2005-07-12 devnull scorecp(p, c->info.score);
471 a0d146ed 2005-07-12 devnull p += VtScoreSize;
473 a0d146ed 2005-07-12 devnull U8PUT(p, c->encoding);
474 a0d146ed 2005-07-12 devnull p += U8Size;
475 a0d146ed 2005-07-12 devnull U32PUT(p, c->creator);
476 a0d146ed 2005-07-12 devnull p += U32Size;
477 a0d146ed 2005-07-12 devnull U32PUT(p, c->time);
478 a0d146ed 2005-07-12 devnull p += U32Size;
480 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
481 a0d146ed 2005-07-12 devnull sysfatal("packclump packed wrong amount");
483 a0d146ed 2005-07-12 devnull return checkclump(c);
487 a0d146ed 2005-07-12 devnull unpackclumpinfo(ClumpInfo *ci, u8int *buf)
489 a0d146ed 2005-07-12 devnull u8int *p;
491 a0d146ed 2005-07-12 devnull p = buf;
492 a0d146ed 2005-07-12 devnull ci->type = vtfromdisktype(U8GET(p));
493 a0d146ed 2005-07-12 devnull p += U8Size;
494 a0d146ed 2005-07-12 devnull ci->size = U16GET(p);
495 a0d146ed 2005-07-12 devnull p += U16Size;
496 a0d146ed 2005-07-12 devnull ci->uncsize = U16GET(p);
497 a0d146ed 2005-07-12 devnull p += U16Size;
498 a0d146ed 2005-07-12 devnull scorecp(ci->score, p);
499 a0d146ed 2005-07-12 devnull p += VtScoreSize;
501 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
502 a0d146ed 2005-07-12 devnull sysfatal("unpackclumpinfo unpacked wrong amount");
506 a0d146ed 2005-07-12 devnull packclumpinfo(ClumpInfo *ci, u8int *buf)
508 a0d146ed 2005-07-12 devnull u8int *p;
510 a0d146ed 2005-07-12 devnull p = buf;
511 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(ci->type));
512 a0d146ed 2005-07-12 devnull p += U8Size;
513 a0d146ed 2005-07-12 devnull U16PUT(p, ci->size);
514 a0d146ed 2005-07-12 devnull p += U16Size;
515 a0d146ed 2005-07-12 devnull U16PUT(p, ci->uncsize);
516 a0d146ed 2005-07-12 devnull p += U16Size;
517 a0d146ed 2005-07-12 devnull scorecp(p, ci->score);
518 a0d146ed 2005-07-12 devnull p += VtScoreSize;
520 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
521 a0d146ed 2005-07-12 devnull sysfatal("packclumpinfo packed wrong amount");
525 a0d146ed 2005-07-12 devnull unpackisect(ISect *is, u8int *buf)
527 a0d146ed 2005-07-12 devnull u8int *p;
528 a0d146ed 2005-07-12 devnull u32int m;
529 a0d146ed 2005-07-12 devnull char fbuf[20];
531 a0d146ed 2005-07-12 devnull p = buf;
534 a0d146ed 2005-07-12 devnull m = U32GET(p);
535 a0d146ed 2005-07-12 devnull if(m != ISectMagic){
536 27d28098 2007-04-21 devnull seterr(ECorrupt, "index section has wrong magic number: %s expected ISectMagic (%#lux)",
537 a0d146ed 2005-07-12 devnull fmtmagic(fbuf, m), ISectMagic);
538 a0d146ed 2005-07-12 devnull return -1;
540 a0d146ed 2005-07-12 devnull p += U32Size;
541 a0d146ed 2005-07-12 devnull is->version = U32GET(p);
542 a0d146ed 2005-07-12 devnull p += U32Size;
543 a0d146ed 2005-07-12 devnull namecp(is->name, (char*)p);
544 a0d146ed 2005-07-12 devnull p += ANameSize;
545 a0d146ed 2005-07-12 devnull namecp(is->index, (char*)p);
546 a0d146ed 2005-07-12 devnull p += ANameSize;
547 a0d146ed 2005-07-12 devnull is->blocksize = U32GET(p);
548 a0d146ed 2005-07-12 devnull p += U32Size;
549 a0d146ed 2005-07-12 devnull is->blockbase = U32GET(p);
550 a0d146ed 2005-07-12 devnull p += U32Size;
551 a0d146ed 2005-07-12 devnull is->blocks = U32GET(p);
552 a0d146ed 2005-07-12 devnull p += U32Size;
553 a0d146ed 2005-07-12 devnull is->start = U32GET(p);
554 a0d146ed 2005-07-12 devnull p += U32Size;
555 a0d146ed 2005-07-12 devnull is->stop = U32GET(p);
556 a0d146ed 2005-07-12 devnull p += U32Size;
557 a0d146ed 2005-07-12 devnull if(buf + ISectSize1 != p)
558 a0d146ed 2005-07-12 devnull sysfatal("unpackisect unpacked wrong amount");
559 a0d146ed 2005-07-12 devnull is->bucketmagic = 0;
560 a0d146ed 2005-07-12 devnull if(is->version == ISectVersion2){
561 a0d146ed 2005-07-12 devnull is->bucketmagic = U32GET(p);
562 a0d146ed 2005-07-12 devnull p += U32Size;
563 a0d146ed 2005-07-12 devnull if(buf + ISectSize2 != p)
564 a0d146ed 2005-07-12 devnull sysfatal("unpackisect unpacked wrong amount");
567 a0d146ed 2005-07-12 devnull return 0;
571 a0d146ed 2005-07-12 devnull packisect(ISect *is, u8int *buf)
573 a0d146ed 2005-07-12 devnull u8int *p;
575 a0d146ed 2005-07-12 devnull p = buf;
577 a0d146ed 2005-07-12 devnull U32PUT(p, ISectMagic);
578 a0d146ed 2005-07-12 devnull p += U32Size;
579 a0d146ed 2005-07-12 devnull U32PUT(p, is->version);
580 a0d146ed 2005-07-12 devnull p += U32Size;
581 a0d146ed 2005-07-12 devnull namecp((char*)p, is->name);
582 a0d146ed 2005-07-12 devnull p += ANameSize;
583 a0d146ed 2005-07-12 devnull namecp((char*)p, is->index);
584 a0d146ed 2005-07-12 devnull p += ANameSize;
585 a0d146ed 2005-07-12 devnull U32PUT(p, is->blocksize);
586 a0d146ed 2005-07-12 devnull p += U32Size;
587 a0d146ed 2005-07-12 devnull U32PUT(p, is->blockbase);
588 a0d146ed 2005-07-12 devnull p += U32Size;
589 a0d146ed 2005-07-12 devnull U32PUT(p, is->blocks);
590 a0d146ed 2005-07-12 devnull p += U32Size;
591 a0d146ed 2005-07-12 devnull U32PUT(p, is->start);
592 a0d146ed 2005-07-12 devnull p += U32Size;
593 a0d146ed 2005-07-12 devnull U32PUT(p, is->stop);
594 a0d146ed 2005-07-12 devnull p += U32Size;
595 a0d146ed 2005-07-12 devnull if(buf + ISectSize1 != p)
596 a0d146ed 2005-07-12 devnull sysfatal("packisect packed wrong amount");
597 a0d146ed 2005-07-12 devnull if(is->version == ISectVersion2){
598 a0d146ed 2005-07-12 devnull U32PUT(p, is->bucketmagic);
599 a0d146ed 2005-07-12 devnull p += U32Size;
600 a0d146ed 2005-07-12 devnull if(buf + ISectSize2 != p)
601 a0d146ed 2005-07-12 devnull sysfatal("packisect packed wrong amount");
604 a0d146ed 2005-07-12 devnull return 0;
608 a0d146ed 2005-07-12 devnull unpackientry(IEntry *ie, u8int *buf)
610 a0d146ed 2005-07-12 devnull u8int *p;
612 a0d146ed 2005-07-12 devnull p = buf;
614 a0d146ed 2005-07-12 devnull scorecp(ie->score, p);
615 a0d146ed 2005-07-12 devnull p += VtScoreSize;
616 7a400ee9 2007-09-25 rsc /* ie->wtime = U32GET(p); */
617 a0d146ed 2005-07-12 devnull p += U32Size;
618 7a400ee9 2007-09-25 rsc /* ie->train = U16GET(p); */
619 a0d146ed 2005-07-12 devnull p += U16Size;
620 28b49df3 2006-07-18 devnull if(p - buf != IEntryAddrOff)
621 28b49df3 2006-07-18 devnull sysfatal("unpackentry bad IEntryAddrOff amount");
622 a0d146ed 2005-07-12 devnull ie->ia.addr = U64GET(p);
623 a0d146ed 2005-07-12 devnull if(ie->ia.addr>>56) print("%.8H => %llux\n", p, ie->ia.addr);
624 a0d146ed 2005-07-12 devnull p += U64Size;
625 a0d146ed 2005-07-12 devnull ie->ia.size = U16GET(p);
626 a0d146ed 2005-07-12 devnull p += U16Size;
627 a0d146ed 2005-07-12 devnull if(p - buf != IEntryTypeOff)
628 a0d146ed 2005-07-12 devnull sysfatal("unpackientry bad IEntryTypeOff amount");
629 a0d146ed 2005-07-12 devnull ie->ia.type = vtfromdisktype(U8GET(p));
630 a0d146ed 2005-07-12 devnull p += U8Size;
631 a0d146ed 2005-07-12 devnull ie->ia.blocks = U8GET(p);
632 a0d146ed 2005-07-12 devnull p += U8Size;
634 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
635 a0d146ed 2005-07-12 devnull sysfatal("unpackientry unpacked wrong amount");
639 a0d146ed 2005-07-12 devnull packientry(IEntry *ie, u8int *buf)
641 a0d146ed 2005-07-12 devnull u32int t32;
642 a0d146ed 2005-07-12 devnull u8int *p;
644 a0d146ed 2005-07-12 devnull p = buf;
646 a0d146ed 2005-07-12 devnull scorecp(p, ie->score);
647 a0d146ed 2005-07-12 devnull p += VtScoreSize;
648 7a400ee9 2007-09-25 rsc U32PUT(p, 0); /* wtime */
649 a0d146ed 2005-07-12 devnull p += U32Size;
650 7a400ee9 2007-09-25 rsc U16PUT(p, 0); /* train */
651 a0d146ed 2005-07-12 devnull p += U16Size;
652 a0d146ed 2005-07-12 devnull U64PUT(p, ie->ia.addr, t32);
653 a0d146ed 2005-07-12 devnull p += U64Size;
654 a0d146ed 2005-07-12 devnull U16PUT(p, ie->ia.size);
655 a0d146ed 2005-07-12 devnull p += U16Size;
656 a0d146ed 2005-07-12 devnull U8PUT(p, vttodisktype(ie->ia.type));
657 a0d146ed 2005-07-12 devnull p += U8Size;
658 a0d146ed 2005-07-12 devnull U8PUT(p, ie->ia.blocks);
659 a0d146ed 2005-07-12 devnull p += U8Size;
661 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
662 a0d146ed 2005-07-12 devnull sysfatal("packientry packed wrong amount");
666 a0d146ed 2005-07-12 devnull unpackibucket(IBucket *b, u8int *buf, u32int magic)
668 a0d146ed 2005-07-12 devnull b->n = U16GET(buf);
669 a0d146ed 2005-07-12 devnull b->data = buf + IBucketSize;
670 a0d146ed 2005-07-12 devnull if(magic && magic != U32GET(buf+U16Size))
671 a0d146ed 2005-07-12 devnull b->n = 0;
675 a0d146ed 2005-07-12 devnull packibucket(IBucket *b, u8int *buf, u32int magic)
677 a0d146ed 2005-07-12 devnull U16PUT(buf, b->n);
678 a0d146ed 2005-07-12 devnull U32PUT(buf+U16Size, magic);
682 a0d146ed 2005-07-12 devnull packbloomhead(Bloom *b, u8int *buf)
684 a0d146ed 2005-07-12 devnull u8int *p;
686 a0d146ed 2005-07-12 devnull p = buf;
687 a0d146ed 2005-07-12 devnull U32PUT(p, BloomMagic);
688 a0d146ed 2005-07-12 devnull U32PUT(p+4, BloomVersion);
689 a0d146ed 2005-07-12 devnull U32PUT(p+8, b->nhash);
690 a0d146ed 2005-07-12 devnull U32PUT(p+12, b->size);
694 a0d146ed 2005-07-12 devnull unpackbloomhead(Bloom *b, u8int *buf)
696 a0d146ed 2005-07-12 devnull u8int *p;
697 a0d146ed 2005-07-12 devnull u32int m;
698 a0d146ed 2005-07-12 devnull char fbuf[20];
700 a0d146ed 2005-07-12 devnull p = buf;
702 a0d146ed 2005-07-12 devnull m = U32GET(p);
703 a0d146ed 2005-07-12 devnull if(m != BloomMagic){
704 27d28098 2007-04-21 devnull seterr(ECorrupt, "bloom filter has wrong magic number: %s expected BloomMagic (%#lux)", fmtmagic(fbuf, m), (ulong)BloomMagic);
705 a0d146ed 2005-07-12 devnull return -1;
707 a0d146ed 2005-07-12 devnull p += U32Size;
709 a0d146ed 2005-07-12 devnull m = U32GET(p);
710 a0d146ed 2005-07-12 devnull if(m != BloomVersion){
711 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "bloom filter has wrong version %ud expected %ud", (uint)m, (uint)BloomVersion);
712 a0d146ed 2005-07-12 devnull return -1;
714 a0d146ed 2005-07-12 devnull p += U32Size;
716 a0d146ed 2005-07-12 devnull b->nhash = U32GET(p);
717 a0d146ed 2005-07-12 devnull p += U32Size;
719 a0d146ed 2005-07-12 devnull b->size = U32GET(p);
720 a0d146ed 2005-07-12 devnull p += U32Size;
721 27d28098 2007-04-21 devnull if(b->size < BloomHeadSize || b->size > MaxBloomSize || (b->size&(b->size-1))){
722 27d28098 2007-04-21 devnull seterr(ECorrupt, "bloom filter has invalid size %#lux", b->size);
723 27d28098 2007-04-21 devnull return -1;
726 a0d146ed 2005-07-12 devnull if(buf + BloomHeadSize != p)
727 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
729 a0d146ed 2005-07-12 devnull return 0;