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 f5a8ea6f 2011-06-02 rsc int debugarena = -1; /* hack to improve error reporting */
19 f5a8ea6f 2011-06-02 rsc
20 a0d146ed 2005-07-12 devnull static struct {
21 a0d146ed 2005-07-12 devnull u32int m;
22 a0d146ed 2005-07-12 devnull char *s;
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",
29 a0d146ed 2005-07-12 devnull };
30 a0d146ed 2005-07-12 devnull
31 a0d146ed 2005-07-12 devnull static char*
32 a0d146ed 2005-07-12 devnull fmtmagic(char *s, u32int m)
33 a0d146ed 2005-07-12 devnull {
34 a0d146ed 2005-07-12 devnull int i;
35 a0d146ed 2005-07-12 devnull
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;
41 a0d146ed 2005-07-12 devnull }
42 a0d146ed 2005-07-12 devnull
43 a0d146ed 2005-07-12 devnull u32int
44 a0d146ed 2005-07-12 devnull unpackmagic(u8int *buf)
45 a0d146ed 2005-07-12 devnull {
46 a0d146ed 2005-07-12 devnull return U32GET(buf);
47 a0d146ed 2005-07-12 devnull }
48 a0d146ed 2005-07-12 devnull
49 a0d146ed 2005-07-12 devnull void
50 a0d146ed 2005-07-12 devnull packmagic(u32int magic, u8int *buf)
51 a0d146ed 2005-07-12 devnull {
52 a0d146ed 2005-07-12 devnull U32PUT(buf, magic);
53 a0d146ed 2005-07-12 devnull }
54 a0d146ed 2005-07-12 devnull
55 a0d146ed 2005-07-12 devnull int
56 a0d146ed 2005-07-12 devnull unpackarenapart(ArenaPart *ap, u8int *buf)
57 a0d146ed 2005-07-12 devnull {
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];
61 a0d146ed 2005-07-12 devnull
62 a0d146ed 2005-07-12 devnull p = buf;
63 a0d146ed 2005-07-12 devnull
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;
68 a0d146ed 2005-07-12 devnull }
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;
76 a0d146ed 2005-07-12 devnull
77 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
78 a0d146ed 2005-07-12 devnull sysfatal("unpackarenapart unpacked wrong amount");
79 a0d146ed 2005-07-12 devnull
80 a0d146ed 2005-07-12 devnull return 0;
81 a0d146ed 2005-07-12 devnull }
82 a0d146ed 2005-07-12 devnull
83 a0d146ed 2005-07-12 devnull int
84 a0d146ed 2005-07-12 devnull packarenapart(ArenaPart *ap, u8int *buf)
85 a0d146ed 2005-07-12 devnull {
86 a0d146ed 2005-07-12 devnull u8int *p;
87 a0d146ed 2005-07-12 devnull
88 a0d146ed 2005-07-12 devnull p = buf;
89 a0d146ed 2005-07-12 devnull
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;
98 a0d146ed 2005-07-12 devnull
99 a0d146ed 2005-07-12 devnull if(buf + ArenaPartSize != p)
100 a0d146ed 2005-07-12 devnull sysfatal("packarenapart packed wrong amount");
101 a0d146ed 2005-07-12 devnull
102 a0d146ed 2005-07-12 devnull return 0;
103 a0d146ed 2005-07-12 devnull }
104 a0d146ed 2005-07-12 devnull
105 a0d146ed 2005-07-12 devnull int
106 a0d146ed 2005-07-12 devnull unpackarena(Arena *arena, u8int *buf)
107 a0d146ed 2005-07-12 devnull {
108 a0d146ed 2005-07-12 devnull int sz;
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];
112 a0d146ed 2005-07-12 devnull
113 a0d146ed 2005-07-12 devnull p = buf;
114 a0d146ed 2005-07-12 devnull
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;
121 a0d146ed 2005-07-12 devnull }
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;
138 a0d146ed 2005-07-12 devnull }
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;
149 a0d146ed 2005-07-12 devnull break;
150 a0d146ed 2005-07-12 devnull case ArenaVersion5:
151 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
152 a0d146ed 2005-07-12 devnull break;
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;
156 a0d146ed 2005-07-12 devnull }
157 28b49df3 2006-07-18 devnull /*
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.
163 28b49df3 2006-07-18 devnull *
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.
170 28b49df3 2006-07-18 devnull */
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;
184 fa325e9b 2020-01-10 cross
185 9f8a101a 2008-04-16 rsc /*
186 9f8a101a 2008-04-16 rsc * 2008/4/2
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.
195 9f8a101a 2008-04-16 rsc *
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.
200 9f8a101a 2008-04-16 rsc *
201 9f8a101a 2008-04-16 rsc * If we encounter such a bogus arena, fix the sealed field.
202 9f8a101a 2008-04-16 rsc */
203 9f8a101a 2008-04-16 rsc if(arena->diskstats.sealed)
204 9f8a101a 2008-04-16 rsc arena->memstats.sealed = 1;
205 28b49df3 2006-07-18 devnull }else
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");
209 a0d146ed 2005-07-12 devnull
210 a0d146ed 2005-07-12 devnull return 0;
211 a0d146ed 2005-07-12 devnull }
212 a0d146ed 2005-07-12 devnull
213 a0d146ed 2005-07-12 devnull int
214 a0d146ed 2005-07-12 devnull packarena(Arena *arena, u8int *buf)
215 a0d146ed 2005-07-12 devnull {
216 28b49df3 2006-07-18 devnull return _packarena(arena, buf, 0);
217 28b49df3 2006-07-18 devnull }
218 28b49df3 2006-07-18 devnull
219 28b49df3 2006-07-18 devnull int
220 28b49df3 2006-07-18 devnull _packarena(Arena *arena, u8int *buf, int forceext)
221 28b49df3 2006-07-18 devnull {
222 a0d146ed 2005-07-12 devnull int sz;
223 a0d146ed 2005-07-12 devnull u8int *p;
224 a0d146ed 2005-07-12 devnull u32int t32;
225 a0d146ed 2005-07-12 devnull
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);
232 a0d146ed 2005-07-12 devnull break;
233 a0d146ed 2005-07-12 devnull case ArenaVersion5:
234 a0d146ed 2005-07-12 devnull sz = ArenaSize5;
235 a0d146ed 2005-07-12 devnull break;
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;
239 a0d146ed 2005-07-12 devnull }
240 a0d146ed 2005-07-12 devnull
241 a0d146ed 2005-07-12 devnull p = buf;
242 a0d146ed 2005-07-12 devnull
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;
260 a0d146ed 2005-07-12 devnull }
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;
267 fa325e9b 2020-01-10 cross
268 28b49df3 2006-07-18 devnull /*
269 28b49df3 2006-07-18 devnull * Extension fields; see above.
270 28b49df3 2006-07-18 devnull */
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;
290 9f8a101a 2008-04-16 rsc }else{
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;
295 28b49df3 2006-07-18 devnull }
296 a0d146ed 2005-07-12 devnull
297 a0d146ed 2005-07-12 devnull if(buf + sz != p)
298 a0d146ed 2005-07-12 devnull sysfatal("packarena packed wrong amount");
299 a0d146ed 2005-07-12 devnull
300 a0d146ed 2005-07-12 devnull return 0;
301 a0d146ed 2005-07-12 devnull }
302 a0d146ed 2005-07-12 devnull
303 a0d146ed 2005-07-12 devnull int
304 a0d146ed 2005-07-12 devnull unpackarenahead(ArenaHead *head, u8int *buf)
305 a0d146ed 2005-07-12 devnull {
306 a0d146ed 2005-07-12 devnull u8int *p;
307 a0d146ed 2005-07-12 devnull u32int m;
308 a0d146ed 2005-07-12 devnull int sz;
309 27d28098 2007-04-21 devnull char fbuf[20];
310 a0d146ed 2005-07-12 devnull
311 a0d146ed 2005-07-12 devnull p = buf;
312 a0d146ed 2005-07-12 devnull
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;
319 27d28098 2007-04-21 devnull }
320 a0d146ed 2005-07-12 devnull
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;
333 a0d146ed 2005-07-12 devnull }
334 a0d146ed 2005-07-12 devnull
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;
339 a0d146ed 2005-07-12 devnull break;
340 a0d146ed 2005-07-12 devnull case ArenaVersion5:
341 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
342 a0d146ed 2005-07-12 devnull break;
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;
346 a0d146ed 2005-07-12 devnull }
347 a0d146ed 2005-07-12 devnull
348 a0d146ed 2005-07-12 devnull if(buf + sz != p)
349 a0d146ed 2005-07-12 devnull sysfatal("unpackarenahead unpacked wrong amount");
350 a0d146ed 2005-07-12 devnull
351 a0d146ed 2005-07-12 devnull return 0;
352 a0d146ed 2005-07-12 devnull }
353 a0d146ed 2005-07-12 devnull
354 a0d146ed 2005-07-12 devnull int
355 a0d146ed 2005-07-12 devnull packarenahead(ArenaHead *head, u8int *buf)
356 a0d146ed 2005-07-12 devnull {
357 a0d146ed 2005-07-12 devnull u8int *p;
358 a0d146ed 2005-07-12 devnull int sz;
359 a0d146ed 2005-07-12 devnull u32int t32;
360 a0d146ed 2005-07-12 devnull
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);
367 a0d146ed 2005-07-12 devnull break;
368 a0d146ed 2005-07-12 devnull case ArenaVersion5:
369 a0d146ed 2005-07-12 devnull sz = ArenaHeadSize5;
370 a0d146ed 2005-07-12 devnull break;
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;
374 a0d146ed 2005-07-12 devnull }
375 a0d146ed 2005-07-12 devnull
376 a0d146ed 2005-07-12 devnull p = buf;
377 a0d146ed 2005-07-12 devnull
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;
391 a0d146ed 2005-07-12 devnull }
392 a0d146ed 2005-07-12 devnull if(buf + sz != p)
393 a0d146ed 2005-07-12 devnull sysfatal("packarenahead packed wrong amount");
394 a0d146ed 2005-07-12 devnull
395 a0d146ed 2005-07-12 devnull return 0;
396 a0d146ed 2005-07-12 devnull }
397 a0d146ed 2005-07-12 devnull
398 a0d146ed 2005-07-12 devnull static int
399 a0d146ed 2005-07-12 devnull checkclump(Clump *w)
400 a0d146ed 2005-07-12 devnull {
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;
405 a0d146ed 2005-07-12 devnull }
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;
410 a0d146ed 2005-07-12 devnull }
411 a0d146ed 2005-07-12 devnull }else{
412 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "clump has illegal encoding");
413 a0d146ed 2005-07-12 devnull return -1;
414 a0d146ed 2005-07-12 devnull }
415 a0d146ed 2005-07-12 devnull
416 a0d146ed 2005-07-12 devnull return 0;
417 a0d146ed 2005-07-12 devnull }
418 a0d146ed 2005-07-12 devnull
419 a0d146ed 2005-07-12 devnull int
420 a0d146ed 2005-07-12 devnull unpackclump(Clump *c, u8int *buf, u32int cmagic)
421 a0d146ed 2005-07-12 devnull {
422 a0d146ed 2005-07-12 devnull u8int *p;
423 a0d146ed 2005-07-12 devnull u32int magic;
424 a0d146ed 2005-07-12 devnull
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;
430 a0d146ed 2005-07-12 devnull }
431 a0d146ed 2005-07-12 devnull p += U32Size;
432 a0d146ed 2005-07-12 devnull
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;
441 a0d146ed 2005-07-12 devnull
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;
448 a0d146ed 2005-07-12 devnull
449 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
450 a0d146ed 2005-07-12 devnull sysfatal("unpackclump unpacked wrong amount");
451 a0d146ed 2005-07-12 devnull
452 a0d146ed 2005-07-12 devnull return checkclump(c);
453 a0d146ed 2005-07-12 devnull }
454 a0d146ed 2005-07-12 devnull
455 a0d146ed 2005-07-12 devnull int
456 a0d146ed 2005-07-12 devnull packclump(Clump *c, u8int *buf, u32int magic)
457 a0d146ed 2005-07-12 devnull {
458 a0d146ed 2005-07-12 devnull u8int *p;
459 a0d146ed 2005-07-12 devnull
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;
463 a0d146ed 2005-07-12 devnull
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;
472 a0d146ed 2005-07-12 devnull
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;
479 a0d146ed 2005-07-12 devnull
480 a0d146ed 2005-07-12 devnull if(buf + ClumpSize != p)
481 a0d146ed 2005-07-12 devnull sysfatal("packclump packed wrong amount");
482 a0d146ed 2005-07-12 devnull
483 a0d146ed 2005-07-12 devnull return checkclump(c);
484 a0d146ed 2005-07-12 devnull }
485 a0d146ed 2005-07-12 devnull
486 a0d146ed 2005-07-12 devnull void
487 a0d146ed 2005-07-12 devnull unpackclumpinfo(ClumpInfo *ci, u8int *buf)
488 a0d146ed 2005-07-12 devnull {
489 a0d146ed 2005-07-12 devnull u8int *p;
490 a0d146ed 2005-07-12 devnull
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;
500 a0d146ed 2005-07-12 devnull
501 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
502 a0d146ed 2005-07-12 devnull sysfatal("unpackclumpinfo unpacked wrong amount");
503 a0d146ed 2005-07-12 devnull }
504 a0d146ed 2005-07-12 devnull
505 a0d146ed 2005-07-12 devnull void
506 a0d146ed 2005-07-12 devnull packclumpinfo(ClumpInfo *ci, u8int *buf)
507 a0d146ed 2005-07-12 devnull {
508 a0d146ed 2005-07-12 devnull u8int *p;
509 a0d146ed 2005-07-12 devnull
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;
519 a0d146ed 2005-07-12 devnull
520 a0d146ed 2005-07-12 devnull if(buf + ClumpInfoSize != p)
521 a0d146ed 2005-07-12 devnull sysfatal("packclumpinfo packed wrong amount");
522 a0d146ed 2005-07-12 devnull }
523 a0d146ed 2005-07-12 devnull
524 a0d146ed 2005-07-12 devnull int
525 a0d146ed 2005-07-12 devnull unpackisect(ISect *is, u8int *buf)
526 a0d146ed 2005-07-12 devnull {
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];
530 a0d146ed 2005-07-12 devnull
531 a0d146ed 2005-07-12 devnull p = buf;
532 a0d146ed 2005-07-12 devnull
533 a0d146ed 2005-07-12 devnull
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;
539 a0d146ed 2005-07-12 devnull }
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");
565 a0d146ed 2005-07-12 devnull }
566 a0d146ed 2005-07-12 devnull
567 a0d146ed 2005-07-12 devnull return 0;
568 a0d146ed 2005-07-12 devnull }
569 a0d146ed 2005-07-12 devnull
570 a0d146ed 2005-07-12 devnull int
571 a0d146ed 2005-07-12 devnull packisect(ISect *is, u8int *buf)
572 a0d146ed 2005-07-12 devnull {
573 a0d146ed 2005-07-12 devnull u8int *p;
574 a0d146ed 2005-07-12 devnull
575 a0d146ed 2005-07-12 devnull p = buf;
576 a0d146ed 2005-07-12 devnull
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");
602 a0d146ed 2005-07-12 devnull }
603 a0d146ed 2005-07-12 devnull
604 a0d146ed 2005-07-12 devnull return 0;
605 a0d146ed 2005-07-12 devnull }
606 a0d146ed 2005-07-12 devnull
607 a0d146ed 2005-07-12 devnull void
608 a0d146ed 2005-07-12 devnull unpackientry(IEntry *ie, u8int *buf)
609 a0d146ed 2005-07-12 devnull {
610 a0d146ed 2005-07-12 devnull u8int *p;
611 a0d146ed 2005-07-12 devnull
612 a0d146ed 2005-07-12 devnull p = buf;
613 a0d146ed 2005-07-12 devnull
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;
633 a0d146ed 2005-07-12 devnull
634 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
635 a0d146ed 2005-07-12 devnull sysfatal("unpackientry unpacked wrong amount");
636 a0d146ed 2005-07-12 devnull }
637 a0d146ed 2005-07-12 devnull
638 a0d146ed 2005-07-12 devnull void
639 a0d146ed 2005-07-12 devnull packientry(IEntry *ie, u8int *buf)
640 a0d146ed 2005-07-12 devnull {
641 a0d146ed 2005-07-12 devnull u32int t32;
642 a0d146ed 2005-07-12 devnull u8int *p;
643 a0d146ed 2005-07-12 devnull
644 a0d146ed 2005-07-12 devnull p = buf;
645 a0d146ed 2005-07-12 devnull
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;
660 a0d146ed 2005-07-12 devnull
661 a0d146ed 2005-07-12 devnull if(p - buf != IEntrySize)
662 a0d146ed 2005-07-12 devnull sysfatal("packientry packed wrong amount");
663 a0d146ed 2005-07-12 devnull }
664 a0d146ed 2005-07-12 devnull
665 a0d146ed 2005-07-12 devnull void
666 a0d146ed 2005-07-12 devnull unpackibucket(IBucket *b, u8int *buf, u32int magic)
667 a0d146ed 2005-07-12 devnull {
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;
672 fa325e9b 2020-01-10 cross }
673 a0d146ed 2005-07-12 devnull
674 a0d146ed 2005-07-12 devnull void
675 a0d146ed 2005-07-12 devnull packibucket(IBucket *b, u8int *buf, u32int magic)
676 a0d146ed 2005-07-12 devnull {
677 a0d146ed 2005-07-12 devnull U16PUT(buf, b->n);
678 a0d146ed 2005-07-12 devnull U32PUT(buf+U16Size, magic);
679 a0d146ed 2005-07-12 devnull }
680 a0d146ed 2005-07-12 devnull
681 a0d146ed 2005-07-12 devnull void
682 a0d146ed 2005-07-12 devnull packbloomhead(Bloom *b, u8int *buf)
683 a0d146ed 2005-07-12 devnull {
684 a0d146ed 2005-07-12 devnull u8int *p;
685 a0d146ed 2005-07-12 devnull
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);
691 a0d146ed 2005-07-12 devnull }
692 a0d146ed 2005-07-12 devnull
693 a0d146ed 2005-07-12 devnull int
694 a0d146ed 2005-07-12 devnull unpackbloomhead(Bloom *b, u8int *buf)
695 a0d146ed 2005-07-12 devnull {
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];
699 a0d146ed 2005-07-12 devnull
700 a0d146ed 2005-07-12 devnull p = buf;
701 a0d146ed 2005-07-12 devnull
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;
706 a0d146ed 2005-07-12 devnull }
707 a0d146ed 2005-07-12 devnull p += U32Size;
708 fa325e9b 2020-01-10 cross
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;
713 a0d146ed 2005-07-12 devnull }
714 a0d146ed 2005-07-12 devnull p += U32Size;
715 a0d146ed 2005-07-12 devnull
716 a0d146ed 2005-07-12 devnull b->nhash = U32GET(p);
717 a0d146ed 2005-07-12 devnull p += U32Size;
718 a0d146ed 2005-07-12 devnull
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;
724 27d28098 2007-04-21 devnull }
725 a0d146ed 2005-07-12 devnull
726 a0d146ed 2005-07-12 devnull if(buf + BloomHeadSize != p)
727 a0d146ed 2005-07-12 devnull sysfatal("unpackarena unpacked wrong amount");
728 a0d146ed 2005-07-12 devnull
729 a0d146ed 2005-07-12 devnull return 0;
730 a0d146ed 2005-07-12 devnull }