Blame


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"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull /*
6 a0d146ed 2005-07-12 devnull * disk structure conversion routines
7 a0d146ed 2005-07-12 devnull */
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))
12 a0d146ed 2005-07-12 devnull
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)
17 a0d146ed 2005-07-12 devnull
18 a0d146ed 2005-07-12 devnull static struct {
19 a0d146ed 2005-07-12 devnull u32int m;
20 a0d146ed 2005-07-12 devnull char *s;
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",
27 a0d146ed 2005-07-12 devnull };
28 a0d146ed 2005-07-12 devnull
29 a0d146ed 2005-07-12 devnull static char*
30 a0d146ed 2005-07-12 devnull fmtmagic(char *s, u32int m)
31 a0d146ed 2005-07-12 devnull {
32 a0d146ed 2005-07-12 devnull int i;
33 a0d146ed 2005-07-12 devnull
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;
39 a0d146ed 2005-07-12 devnull }
40 a0d146ed 2005-07-12 devnull
41 a0d146ed 2005-07-12 devnull u32int
42 a0d146ed 2005-07-12 devnull unpackmagic(u8int *buf)
43 a0d146ed 2005-07-12 devnull {
44 a0d146ed 2005-07-12 devnull return U32GET(buf);
45 a0d146ed 2005-07-12 devnull }
46 a0d146ed 2005-07-12 devnull
47 a0d146ed 2005-07-12 devnull void
48 a0d146ed 2005-07-12 devnull packmagic(u32int magic, u8int *buf)
49 a0d146ed 2005-07-12 devnull {
50 a0d146ed 2005-07-12 devnull U32PUT(buf, magic);
51 a0d146ed 2005-07-12 devnull }
52 a0d146ed 2005-07-12 devnull
53 a0d146ed 2005-07-12 devnull int
54 a0d146ed 2005-07-12 devnull unpackarenapart(ArenaPart *ap, u8int *buf)
55 a0d146ed 2005-07-12 devnull {
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];
59 a0d146ed 2005-07-12 devnull
60 a0d146ed 2005-07-12 devnull p = buf;
61 a0d146ed 2005-07-12 devnull
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;
66 a0d146ed 2005-07-12 devnull }
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;
74 a0d146ed 2005-07-12 devnull
75 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
76 a0d146ed 2005-07-12 devnull sysfatal("unpackarenapart unpacked wrong amount");
77 a0d146ed 2005-07-12 devnull
78 a0d146ed 2005-07-12 devnull return 0;
79 a0d146ed 2005-07-12 devnull }
80 a0d146ed 2005-07-12 devnull
81 a0d146ed 2005-07-12 devnull int
82 a0d146ed 2005-07-12 devnull packarenapart(ArenaPart *ap, u8int *buf)
83 a0d146ed 2005-07-12 devnull {
84 a0d146ed 2005-07-12 devnull u8int *p;
85 a0d146ed 2005-07-12 devnull
86 a0d146ed 2005-07-12 devnull p = buf;
87 a0d146ed 2005-07-12 devnull
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;
96 a0d146ed 2005-07-12 devnull
97 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
98 a0d146ed 2005-07-12 devnull sysfatal("packarenapart packed wrong amount");
99 a0d146ed 2005-07-12 devnull
100 a0d146ed 2005-07-12 devnull return 0;
101 a0d146ed 2005-07-12 devnull }
102 a0d146ed 2005-07-12 devnull
103 a0d146ed 2005-07-12 devnull int
104 a0d146ed 2005-07-12 devnull unpackarena(Arena *arena, u8int *buf)
105 a0d146ed 2005-07-12 devnull {
106 a0d146ed 2005-07-12 devnull int sz;
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];
110 a0d146ed 2005-07-12 devnull
111 a0d146ed 2005-07-12 devnull p = buf;
112 a0d146ed 2005-07-12 devnull
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;
117 a0d146ed 2005-07-12 devnull }
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;
134 a0d146ed 2005-07-12 devnull }
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;
141 a0d146ed 2005-07-12 devnull
142 a0d146ed 2005-07-12 devnull arena->memstats = arena->diskstats;
143 a0d146ed 2005-07-12 devnull
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;
148 a0d146ed 2005-07-12 devnull break;
149 a0d146ed 2005-07-12 devnull case ArenaVersion5:
150 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
151 a0d146ed 2005-07-12 devnull break;
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;
155 a0d146ed 2005-07-12 devnull }
156 a0d146ed 2005-07-12 devnull if(buf + sz != p)
157 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
158 a0d146ed 2005-07-12 devnull
159 a0d146ed 2005-07-12 devnull return 0;
160 a0d146ed 2005-07-12 devnull }
161 a0d146ed 2005-07-12 devnull
162 a0d146ed 2005-07-12 devnull int
163 a0d146ed 2005-07-12 devnull packarena(Arena *arena, u8int *buf)
164 a0d146ed 2005-07-12 devnull {
165 a0d146ed 2005-07-12 devnull int sz;
166 a0d146ed 2005-07-12 devnull u8int *p;
167 a0d146ed 2005-07-12 devnull u32int t32;
168 a0d146ed 2005-07-12 devnull
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);
175 a0d146ed 2005-07-12 devnull break;
176 a0d146ed 2005-07-12 devnull case ArenaVersion5:
177 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
178 a0d146ed 2005-07-12 devnull break;
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;
182 a0d146ed 2005-07-12 devnull }
183 a0d146ed 2005-07-12 devnull
184 a0d146ed 2005-07-12 devnull p = buf;
185 a0d146ed 2005-07-12 devnull
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;
203 a0d146ed 2005-07-12 devnull }
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;
210 a0d146ed 2005-07-12 devnull
211 a0d146ed 2005-07-12 devnull if(buf + sz != p)
212 a0d146ed 2005-07-12 devnull sysfatal("packarena packed wrong amount");
213 a0d146ed 2005-07-12 devnull
214 a0d146ed 2005-07-12 devnull return 0;
215 a0d146ed 2005-07-12 devnull }
216 a0d146ed 2005-07-12 devnull
217 a0d146ed 2005-07-12 devnull int
218 a0d146ed 2005-07-12 devnull unpackarenahead(ArenaHead *head, u8int *buf)
219 a0d146ed 2005-07-12 devnull {
220 a0d146ed 2005-07-12 devnull u8int *p;
221 a0d146ed 2005-07-12 devnull u32int m;
222 a0d146ed 2005-07-12 devnull int sz;
223 a0d146ed 2005-07-12 devnull
224 a0d146ed 2005-07-12 devnull p = buf;
225 a0d146ed 2005-07-12 devnull
226 a0d146ed 2005-07-12 devnull m = U32GET(p);
227 a0d146ed 2005-07-12 devnull /* XXX check magic! */
228 a0d146ed 2005-07-12 devnull
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;
241 a0d146ed 2005-07-12 devnull }
242 a0d146ed 2005-07-12 devnull
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;
247 a0d146ed 2005-07-12 devnull break;
248 a0d146ed 2005-07-12 devnull case ArenaVersion5:
249 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
250 a0d146ed 2005-07-12 devnull break;
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;
254 a0d146ed 2005-07-12 devnull }
255 a0d146ed 2005-07-12 devnull
256 a0d146ed 2005-07-12 devnull if(buf + sz != p)
257 a0d146ed 2005-07-12 devnull sysfatal("unpackarenahead unpacked wrong amount");
258 a0d146ed 2005-07-12 devnull
259 a0d146ed 2005-07-12 devnull return 0;
260 a0d146ed 2005-07-12 devnull }
261 a0d146ed 2005-07-12 devnull
262 a0d146ed 2005-07-12 devnull int
263 a0d146ed 2005-07-12 devnull packarenahead(ArenaHead *head, u8int *buf)
264 a0d146ed 2005-07-12 devnull {
265 a0d146ed 2005-07-12 devnull u8int *p;
266 a0d146ed 2005-07-12 devnull int sz;
267 a0d146ed 2005-07-12 devnull u32int t32;
268 a0d146ed 2005-07-12 devnull
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);
275 a0d146ed 2005-07-12 devnull break;
276 a0d146ed 2005-07-12 devnull case ArenaVersion5:
277 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
278 a0d146ed 2005-07-12 devnull break;
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;
282 a0d146ed 2005-07-12 devnull }
283 a0d146ed 2005-07-12 devnull
284 a0d146ed 2005-07-12 devnull p = buf;
285 a0d146ed 2005-07-12 devnull
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;
299 a0d146ed 2005-07-12 devnull }
300 a0d146ed 2005-07-12 devnull if(buf + sz != p)
301 a0d146ed 2005-07-12 devnull sysfatal("packarenahead packed wrong amount");
302 a0d146ed 2005-07-12 devnull
303 a0d146ed 2005-07-12 devnull return 0;
304 a0d146ed 2005-07-12 devnull }
305 a0d146ed 2005-07-12 devnull
306 a0d146ed 2005-07-12 devnull static int
307 a0d146ed 2005-07-12 devnull checkclump(Clump *w)
308 a0d146ed 2005-07-12 devnull {
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;
313 a0d146ed 2005-07-12 devnull }
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;
318 a0d146ed 2005-07-12 devnull }
319 a0d146ed 2005-07-12 devnull }else{
320 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has illegal encoding");
321 a0d146ed 2005-07-12 devnull return -1;
322 a0d146ed 2005-07-12 devnull }
323 a0d146ed 2005-07-12 devnull
324 a0d146ed 2005-07-12 devnull return 0;
325 a0d146ed 2005-07-12 devnull }
326 a0d146ed 2005-07-12 devnull
327 a0d146ed 2005-07-12 devnull int
328 a0d146ed 2005-07-12 devnull unpackclump(Clump *c, u8int *buf, u32int cmagic)
329 a0d146ed 2005-07-12 devnull {
330 a0d146ed 2005-07-12 devnull u8int *p;
331 a0d146ed 2005-07-12 devnull u32int magic;
332 a0d146ed 2005-07-12 devnull
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;
338 a0d146ed 2005-07-12 devnull }
339 a0d146ed 2005-07-12 devnull p += U32Size;
340 a0d146ed 2005-07-12 devnull
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;
349 a0d146ed 2005-07-12 devnull
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;
356 a0d146ed 2005-07-12 devnull
357 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
358 a0d146ed 2005-07-12 devnull sysfatal("unpackclump unpacked wrong amount");
359 a0d146ed 2005-07-12 devnull
360 a0d146ed 2005-07-12 devnull return checkclump(c);
361 a0d146ed 2005-07-12 devnull }
362 a0d146ed 2005-07-12 devnull
363 a0d146ed 2005-07-12 devnull int
364 a0d146ed 2005-07-12 devnull packclump(Clump *c, u8int *buf, u32int magic)
365 a0d146ed 2005-07-12 devnull {
366 a0d146ed 2005-07-12 devnull u8int *p;
367 a0d146ed 2005-07-12 devnull
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;
371 a0d146ed 2005-07-12 devnull
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;
380 a0d146ed 2005-07-12 devnull
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;
387 a0d146ed 2005-07-12 devnull
388 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
389 a0d146ed 2005-07-12 devnull sysfatal("packclump packed wrong amount");
390 a0d146ed 2005-07-12 devnull
391 a0d146ed 2005-07-12 devnull return checkclump(c);
392 a0d146ed 2005-07-12 devnull }
393 a0d146ed 2005-07-12 devnull
394 a0d146ed 2005-07-12 devnull void
395 a0d146ed 2005-07-12 devnull unpackclumpinfo(ClumpInfo *ci, u8int *buf)
396 a0d146ed 2005-07-12 devnull {
397 a0d146ed 2005-07-12 devnull u8int *p;
398 a0d146ed 2005-07-12 devnull
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;
408 a0d146ed 2005-07-12 devnull
409 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
410 a0d146ed 2005-07-12 devnull sysfatal("unpackclumpinfo unpacked wrong amount");
411 a0d146ed 2005-07-12 devnull }
412 a0d146ed 2005-07-12 devnull
413 a0d146ed 2005-07-12 devnull void
414 a0d146ed 2005-07-12 devnull packclumpinfo(ClumpInfo *ci, u8int *buf)
415 a0d146ed 2005-07-12 devnull {
416 a0d146ed 2005-07-12 devnull u8int *p;
417 a0d146ed 2005-07-12 devnull
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;
427 a0d146ed 2005-07-12 devnull
428 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
429 a0d146ed 2005-07-12 devnull sysfatal("packclumpinfo packed wrong amount");
430 a0d146ed 2005-07-12 devnull }
431 a0d146ed 2005-07-12 devnull
432 a0d146ed 2005-07-12 devnull int
433 a0d146ed 2005-07-12 devnull unpackisect(ISect *is, u8int *buf)
434 a0d146ed 2005-07-12 devnull {
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];
438 a0d146ed 2005-07-12 devnull
439 a0d146ed 2005-07-12 devnull p = buf;
440 a0d146ed 2005-07-12 devnull
441 a0d146ed 2005-07-12 devnull
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;
447 a0d146ed 2005-07-12 devnull }
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");
473 a0d146ed 2005-07-12 devnull }
474 a0d146ed 2005-07-12 devnull
475 a0d146ed 2005-07-12 devnull return 0;
476 a0d146ed 2005-07-12 devnull }
477 a0d146ed 2005-07-12 devnull
478 a0d146ed 2005-07-12 devnull int
479 a0d146ed 2005-07-12 devnull packisect(ISect *is, u8int *buf)
480 a0d146ed 2005-07-12 devnull {
481 a0d146ed 2005-07-12 devnull u8int *p;
482 a0d146ed 2005-07-12 devnull
483 a0d146ed 2005-07-12 devnull p = buf;
484 a0d146ed 2005-07-12 devnull
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");
510 a0d146ed 2005-07-12 devnull }
511 a0d146ed 2005-07-12 devnull
512 a0d146ed 2005-07-12 devnull return 0;
513 a0d146ed 2005-07-12 devnull }
514 a0d146ed 2005-07-12 devnull
515 a0d146ed 2005-07-12 devnull void
516 a0d146ed 2005-07-12 devnull unpackientry(IEntry *ie, u8int *buf)
517 a0d146ed 2005-07-12 devnull {
518 a0d146ed 2005-07-12 devnull u8int *p;
519 a0d146ed 2005-07-12 devnull
520 a0d146ed 2005-07-12 devnull p = buf;
521 a0d146ed 2005-07-12 devnull
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;
539 a0d146ed 2005-07-12 devnull
540 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
541 a0d146ed 2005-07-12 devnull sysfatal("unpackientry unpacked wrong amount");
542 a0d146ed 2005-07-12 devnull }
543 a0d146ed 2005-07-12 devnull
544 a0d146ed 2005-07-12 devnull void
545 a0d146ed 2005-07-12 devnull packientry(IEntry *ie, u8int *buf)
546 a0d146ed 2005-07-12 devnull {
547 a0d146ed 2005-07-12 devnull u32int t32;
548 a0d146ed 2005-07-12 devnull u8int *p;
549 a0d146ed 2005-07-12 devnull
550 a0d146ed 2005-07-12 devnull p = buf;
551 a0d146ed 2005-07-12 devnull
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;
566 a0d146ed 2005-07-12 devnull
567 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
568 a0d146ed 2005-07-12 devnull sysfatal("packientry packed wrong amount");
569 a0d146ed 2005-07-12 devnull }
570 a0d146ed 2005-07-12 devnull
571 a0d146ed 2005-07-12 devnull void
572 a0d146ed 2005-07-12 devnull unpackibucket(IBucket *b, u8int *buf, u32int magic)
573 a0d146ed 2005-07-12 devnull {
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;
578 a0d146ed 2005-07-12 devnull }
579 a0d146ed 2005-07-12 devnull
580 a0d146ed 2005-07-12 devnull void
581 a0d146ed 2005-07-12 devnull packibucket(IBucket *b, u8int *buf, u32int magic)
582 a0d146ed 2005-07-12 devnull {
583 a0d146ed 2005-07-12 devnull U16PUT(buf, b->n);
584 a0d146ed 2005-07-12 devnull U32PUT(buf+U16Size, magic);
585 a0d146ed 2005-07-12 devnull }
586 a0d146ed 2005-07-12 devnull
587 a0d146ed 2005-07-12 devnull void
588 a0d146ed 2005-07-12 devnull packbloomhead(Bloom *b, u8int *buf)
589 a0d146ed 2005-07-12 devnull {
590 a0d146ed 2005-07-12 devnull u8int *p;
591 a0d146ed 2005-07-12 devnull
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);
597 a0d146ed 2005-07-12 devnull }
598 a0d146ed 2005-07-12 devnull
599 a0d146ed 2005-07-12 devnull int
600 a0d146ed 2005-07-12 devnull unpackbloomhead(Bloom *b, u8int *buf)
601 a0d146ed 2005-07-12 devnull {
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];
605 a0d146ed 2005-07-12 devnull
606 a0d146ed 2005-07-12 devnull p = buf;
607 a0d146ed 2005-07-12 devnull
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;
612 a0d146ed 2005-07-12 devnull }
613 a0d146ed 2005-07-12 devnull p += U32Size;
614 a0d146ed 2005-07-12 devnull
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;
619 a0d146ed 2005-07-12 devnull }
620 a0d146ed 2005-07-12 devnull p += U32Size;
621 a0d146ed 2005-07-12 devnull
622 a0d146ed 2005-07-12 devnull b->nhash = U32GET(p);
623 a0d146ed 2005-07-12 devnull p += U32Size;
624 a0d146ed 2005-07-12 devnull
625 a0d146ed 2005-07-12 devnull b->size = U32GET(p);
626 a0d146ed 2005-07-12 devnull p += U32Size;
627 a0d146ed 2005-07-12 devnull
628 a0d146ed 2005-07-12 devnull if(buf + BloomHeadSize != p)
629 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
630 a0d146ed 2005-07-12 devnull
631 a0d146ed 2005-07-12 devnull return 0;
632 a0d146ed 2005-07-12 devnull }