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 typedef struct AHash AHash;
6 a0d146ed 2005-07-12 devnull
7 a0d146ed 2005-07-12 devnull /*
8 a0d146ed 2005-07-12 devnull * hash table for finding arena's based on their names.
9 a0d146ed 2005-07-12 devnull */
10 a0d146ed 2005-07-12 devnull struct AHash
11 a0d146ed 2005-07-12 devnull {
12 a0d146ed 2005-07-12 devnull AHash *next;
13 a0d146ed 2005-07-12 devnull Arena *arena;
14 a0d146ed 2005-07-12 devnull };
15 a0d146ed 2005-07-12 devnull
16 a0d146ed 2005-07-12 devnull enum
17 a0d146ed 2005-07-12 devnull {
18 a0d146ed 2005-07-12 devnull AHashSize = 512
19 a0d146ed 2005-07-12 devnull };
20 a0d146ed 2005-07-12 devnull
21 a0d146ed 2005-07-12 devnull static AHash *ahash[AHashSize];
22 a0d146ed 2005-07-12 devnull
23 a0d146ed 2005-07-12 devnull static u32int
24 a0d146ed 2005-07-12 devnull hashstr(char *s)
25 a0d146ed 2005-07-12 devnull {
26 a0d146ed 2005-07-12 devnull u32int h;
27 a0d146ed 2005-07-12 devnull int c;
28 a0d146ed 2005-07-12 devnull
29 a0d146ed 2005-07-12 devnull h = 0;
30 a0d146ed 2005-07-12 devnull for(; c = *s; s++){
31 a0d146ed 2005-07-12 devnull c ^= c << 6;
32 a0d146ed 2005-07-12 devnull h += (c << 11) ^ (c >> 1);
33 a0d146ed 2005-07-12 devnull c = *s;
34 a0d146ed 2005-07-12 devnull h ^= (c << 14) + (c << 7) + (c << 4) + c;
35 a0d146ed 2005-07-12 devnull }
36 a0d146ed 2005-07-12 devnull return h;
37 a0d146ed 2005-07-12 devnull }
38 a0d146ed 2005-07-12 devnull
39 a0d146ed 2005-07-12 devnull int
40 a0d146ed 2005-07-12 devnull addarena(Arena *arena)
41 a0d146ed 2005-07-12 devnull {
42 a0d146ed 2005-07-12 devnull AHash *a;
43 a0d146ed 2005-07-12 devnull u32int h;
44 a0d146ed 2005-07-12 devnull
45 a0d146ed 2005-07-12 devnull h = hashstr(arena->name) & (AHashSize - 1);
46 a0d146ed 2005-07-12 devnull a = MK(AHash);
47 a0d146ed 2005-07-12 devnull if(a == nil)
48 a0d146ed 2005-07-12 devnull return -1;
49 a0d146ed 2005-07-12 devnull a->arena = arena;
50 a0d146ed 2005-07-12 devnull a->next = ahash[h];
51 a0d146ed 2005-07-12 devnull ahash[h] = a;
52 a0d146ed 2005-07-12 devnull return 0;
53 a0d146ed 2005-07-12 devnull }
54 a0d146ed 2005-07-12 devnull
55 a0d146ed 2005-07-12 devnull Arena*
56 a0d146ed 2005-07-12 devnull findarena(char *name)
57 a0d146ed 2005-07-12 devnull {
58 a0d146ed 2005-07-12 devnull AHash *a;
59 a0d146ed 2005-07-12 devnull u32int h;
60 a0d146ed 2005-07-12 devnull
61 a0d146ed 2005-07-12 devnull h = hashstr(name) & (AHashSize - 1);
62 a0d146ed 2005-07-12 devnull for(a = ahash[h]; a != nil; a = a->next)
63 a0d146ed 2005-07-12 devnull if(strcmp(a->arena->name, name) == 0)
64 a0d146ed 2005-07-12 devnull return a->arena;
65 a0d146ed 2005-07-12 devnull return nil;
66 a0d146ed 2005-07-12 devnull }
67 a0d146ed 2005-07-12 devnull
68 a0d146ed 2005-07-12 devnull int
69 a0d146ed 2005-07-12 devnull delarena(Arena *arena)
70 a0d146ed 2005-07-12 devnull {
71 a0d146ed 2005-07-12 devnull AHash *a, *last;
72 a0d146ed 2005-07-12 devnull u32int h;
73 a0d146ed 2005-07-12 devnull
74 a0d146ed 2005-07-12 devnull h = hashstr(arena->name) & (AHashSize - 1);
75 a0d146ed 2005-07-12 devnull last = nil;
76 a0d146ed 2005-07-12 devnull for(a = ahash[h]; a != nil; a = a->next){
77 a0d146ed 2005-07-12 devnull if(a->arena == arena){
78 a0d146ed 2005-07-12 devnull if(last != nil)
79 a0d146ed 2005-07-12 devnull last->next = a->next;
80 a0d146ed 2005-07-12 devnull else
81 a0d146ed 2005-07-12 devnull ahash[h] = a->next;
82 a0d146ed 2005-07-12 devnull free(a);
83 a0d146ed 2005-07-12 devnull return 0;
84 a0d146ed 2005-07-12 devnull }
85 a0d146ed 2005-07-12 devnull last = a;
86 a0d146ed 2005-07-12 devnull }
87 a0d146ed 2005-07-12 devnull return -1;
88 a0d146ed 2005-07-12 devnull }
89 a0d146ed 2005-07-12 devnull
90 a0d146ed 2005-07-12 devnull ArenaPart*
91 a0d146ed 2005-07-12 devnull initarenapart(Part *part)
92 a0d146ed 2005-07-12 devnull {
93 a0d146ed 2005-07-12 devnull AMapN amn;
94 a0d146ed 2005-07-12 devnull ArenaPart *ap;
95 a0d146ed 2005-07-12 devnull ZBlock *b;
96 a0d146ed 2005-07-12 devnull u32int i;
97 a0d146ed 2005-07-12 devnull int ok;
98 a0d146ed 2005-07-12 devnull
99 a0d146ed 2005-07-12 devnull b = alloczblock(HeadSize, 0, 0);
100 a0d146ed 2005-07-12 devnull if(b == nil || readpart(part, PartBlank, b->data, HeadSize) < 0){
101 a0d146ed 2005-07-12 devnull seterr(EAdmin, "can't read arena partition header: %r");
102 a0d146ed 2005-07-12 devnull return nil;
103 a0d146ed 2005-07-12 devnull }
104 a0d146ed 2005-07-12 devnull
105 a0d146ed 2005-07-12 devnull ap = MKZ(ArenaPart);
106 a0d146ed 2005-07-12 devnull if(ap == nil){
107 a0d146ed 2005-07-12 devnull freezblock(b);
108 a0d146ed 2005-07-12 devnull return nil;
109 a0d146ed 2005-07-12 devnull }
110 a0d146ed 2005-07-12 devnull ap->part = part;
111 a0d146ed 2005-07-12 devnull ok = unpackarenapart(ap, b->data);
112 a0d146ed 2005-07-12 devnull freezblock(b);
113 a0d146ed 2005-07-12 devnull if(ok < 0){
114 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
115 a0d146ed 2005-07-12 devnull return nil;
116 a0d146ed 2005-07-12 devnull }
117 a0d146ed 2005-07-12 devnull
118 a0d146ed 2005-07-12 devnull ap->tabbase = (PartBlank + HeadSize + ap->blocksize - 1) & ~(ap->blocksize - 1);
119 a0d146ed 2005-07-12 devnull if(ap->version != ArenaPartVersion){
120 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "unknown arena partition version %d", ap->version);
121 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
122 a0d146ed 2005-07-12 devnull return nil;
123 a0d146ed 2005-07-12 devnull }
124 a0d146ed 2005-07-12 devnull if(ap->blocksize & (ap->blocksize - 1)){
125 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "illegal non-power-of-2 block size %d\n", ap->blocksize);
126 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
127 a0d146ed 2005-07-12 devnull return nil;
128 a0d146ed 2005-07-12 devnull }
129 a0d146ed 2005-07-12 devnull if(ap->tabbase >= ap->arenabase){
130 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena partition table overlaps with arena storage");
131 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
132 a0d146ed 2005-07-12 devnull return nil;
133 a0d146ed 2005-07-12 devnull }
134 a0d146ed 2005-07-12 devnull ap->tabsize = ap->arenabase - ap->tabbase;
135 a0d146ed 2005-07-12 devnull partblocksize(part, ap->blocksize);
136 a0d146ed 2005-07-12 devnull ap->size = ap->part->size & ~(u64int)(ap->blocksize - 1);
137 a0d146ed 2005-07-12 devnull
138 a0d146ed 2005-07-12 devnull if(readarenamap(&amn, part, ap->tabbase, ap->tabsize) < 0){
139 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
140 a0d146ed 2005-07-12 devnull return nil;
141 a0d146ed 2005-07-12 devnull }
142 a0d146ed 2005-07-12 devnull ap->narenas = amn.n;
143 a0d146ed 2005-07-12 devnull ap->map = amn.map;
144 a0d146ed 2005-07-12 devnull if(okamap(ap->map, ap->narenas, ap->arenabase, ap->size, "arena table") < 0){
145 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
146 a0d146ed 2005-07-12 devnull return nil;
147 a0d146ed 2005-07-12 devnull }
148 a0d146ed 2005-07-12 devnull
149 a0d146ed 2005-07-12 devnull ap->arenas = MKNZ(Arena*, ap->narenas);
150 a0d146ed 2005-07-12 devnull for(i = 0; i < ap->narenas; i++){
151 f5a8ea6f 2011-06-02 rsc debugarena = i;
152 a0d146ed 2005-07-12 devnull ap->arenas[i] = initarena(part, ap->map[i].start, ap->map[i].stop - ap->map[i].start, ap->blocksize);
153 a0d146ed 2005-07-12 devnull if(ap->arenas[i] == nil){
154 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "%s: %r", ap->map[i].name);
155 a0d146ed 2005-07-12 devnull freearenapart(ap, 1);
156 a0d146ed 2005-07-12 devnull return nil;
157 a0d146ed 2005-07-12 devnull }
158 a0d146ed 2005-07-12 devnull if(namecmp(ap->map[i].name, ap->arenas[i]->name) != 0){
159 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena name mismatches with expected name: %s vs. %s",
160 a0d146ed 2005-07-12 devnull ap->map[i].name, ap->arenas[i]->name);
161 a0d146ed 2005-07-12 devnull freearenapart(ap, 1);
162 a0d146ed 2005-07-12 devnull return nil;
163 a0d146ed 2005-07-12 devnull }
164 a0d146ed 2005-07-12 devnull if(findarena(ap->arenas[i]->name)){
165 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "duplicate arena name %s in %s",
166 a0d146ed 2005-07-12 devnull ap->map[i].name, ap->part->name);
167 a0d146ed 2005-07-12 devnull freearenapart(ap, 1);
168 a0d146ed 2005-07-12 devnull return nil;
169 a0d146ed 2005-07-12 devnull }
170 a0d146ed 2005-07-12 devnull }
171 a0d146ed 2005-07-12 devnull
172 f5a8ea6f 2011-06-02 rsc for(i = 0; i < ap->narenas; i++) {
173 f5a8ea6f 2011-06-02 rsc debugarena = i;
174 a0d146ed 2005-07-12 devnull addarena(ap->arenas[i]);
175 f5a8ea6f 2011-06-02 rsc }
176 f5a8ea6f 2011-06-02 rsc debugarena = -1;
177 a0d146ed 2005-07-12 devnull
178 a0d146ed 2005-07-12 devnull return ap;
179 a0d146ed 2005-07-12 devnull }
180 a0d146ed 2005-07-12 devnull
181 a0d146ed 2005-07-12 devnull ArenaPart*
182 a0d146ed 2005-07-12 devnull newarenapart(Part *part, u32int blocksize, u32int tabsize)
183 a0d146ed 2005-07-12 devnull {
184 a0d146ed 2005-07-12 devnull ArenaPart *ap;
185 a0d146ed 2005-07-12 devnull
186 a0d146ed 2005-07-12 devnull if(blocksize & (blocksize - 1)){
187 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "illegal non-power-of-2 block size %d\n", blocksize);
188 a0d146ed 2005-07-12 devnull return nil;
189 a0d146ed 2005-07-12 devnull }
190 a0d146ed 2005-07-12 devnull ap = MKZ(ArenaPart);
191 a0d146ed 2005-07-12 devnull if(ap == nil)
192 a0d146ed 2005-07-12 devnull return nil;
193 a0d146ed 2005-07-12 devnull
194 a0d146ed 2005-07-12 devnull ap->version = ArenaPartVersion;
195 a0d146ed 2005-07-12 devnull ap->part = part;
196 a0d146ed 2005-07-12 devnull ap->blocksize = blocksize;
197 a0d146ed 2005-07-12 devnull partblocksize(part, blocksize);
198 a0d146ed 2005-07-12 devnull ap->size = part->size & ~(u64int)(blocksize - 1);
199 a0d146ed 2005-07-12 devnull ap->tabbase = (PartBlank + HeadSize + blocksize - 1) & ~(blocksize - 1);
200 a0d146ed 2005-07-12 devnull ap->arenabase = (ap->tabbase + tabsize + blocksize - 1) & ~(blocksize - 1);
201 a0d146ed 2005-07-12 devnull ap->tabsize = ap->arenabase - ap->tabbase;
202 a0d146ed 2005-07-12 devnull ap->narenas = 0;
203 a0d146ed 2005-07-12 devnull
204 a0d146ed 2005-07-12 devnull if(wbarenapart(ap) < 0){
205 a0d146ed 2005-07-12 devnull freearenapart(ap, 0);
206 a0d146ed 2005-07-12 devnull return nil;
207 a0d146ed 2005-07-12 devnull }
208 a0d146ed 2005-07-12 devnull
209 a0d146ed 2005-07-12 devnull return ap;
210 a0d146ed 2005-07-12 devnull }
211 a0d146ed 2005-07-12 devnull
212 a0d146ed 2005-07-12 devnull int
213 a0d146ed 2005-07-12 devnull wbarenapart(ArenaPart *ap)
214 a0d146ed 2005-07-12 devnull {
215 a0d146ed 2005-07-12 devnull ZBlock *b;
216 a0d146ed 2005-07-12 devnull
217 a0d146ed 2005-07-12 devnull if(okamap(ap->map, ap->narenas, ap->arenabase, ap->size, "arena table") < 0)
218 a0d146ed 2005-07-12 devnull return -1;
219 a0d146ed 2005-07-12 devnull b = alloczblock(HeadSize, 1, 0);
220 a0d146ed 2005-07-12 devnull if(b == nil)
221 28b49df3 2006-07-18 devnull /* ZZZ set error message? */
222 a0d146ed 2005-07-12 devnull return -1;
223 a0d146ed 2005-07-12 devnull
224 a0d146ed 2005-07-12 devnull if(packarenapart(ap, b->data) < 0){
225 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "can't make arena partition header: %r");
226 a0d146ed 2005-07-12 devnull freezblock(b);
227 a0d146ed 2005-07-12 devnull return -1;
228 a0d146ed 2005-07-12 devnull }
229 e46cacb0 2007-04-27 devnull if(writepart(ap->part, PartBlank, b->data, HeadSize) < 0 ||
230 e46cacb0 2007-04-27 devnull flushpart(ap->part) < 0){
231 a0d146ed 2005-07-12 devnull seterr(EAdmin, "can't write arena partition header: %r");
232 a0d146ed 2005-07-12 devnull freezblock(b);
233 a0d146ed 2005-07-12 devnull return -1;
234 a0d146ed 2005-07-12 devnull }
235 a0d146ed 2005-07-12 devnull freezblock(b);
236 a0d146ed 2005-07-12 devnull
237 a0d146ed 2005-07-12 devnull return wbarenamap(ap->map, ap->narenas, ap->part, ap->tabbase, ap->tabsize);
238 a0d146ed 2005-07-12 devnull }
239 a0d146ed 2005-07-12 devnull
240 a0d146ed 2005-07-12 devnull void
241 a0d146ed 2005-07-12 devnull freearenapart(ArenaPart *ap, int freearenas)
242 a0d146ed 2005-07-12 devnull {
243 a0d146ed 2005-07-12 devnull int i;
244 a0d146ed 2005-07-12 devnull
245 a0d146ed 2005-07-12 devnull if(ap == nil)
246 a0d146ed 2005-07-12 devnull return;
247 a0d146ed 2005-07-12 devnull if(freearenas){
248 a0d146ed 2005-07-12 devnull for(i = 0; i < ap->narenas; i++){
249 a0d146ed 2005-07-12 devnull if(ap->arenas[i] == nil)
250 a0d146ed 2005-07-12 devnull continue;
251 a0d146ed 2005-07-12 devnull delarena(ap->arenas[i]);
252 a0d146ed 2005-07-12 devnull freearena(ap->arenas[i]);
253 a0d146ed 2005-07-12 devnull }
254 a0d146ed 2005-07-12 devnull }
255 a0d146ed 2005-07-12 devnull free(ap->map);
256 a0d146ed 2005-07-12 devnull free(ap->arenas);
257 a0d146ed 2005-07-12 devnull free(ap);
258 a0d146ed 2005-07-12 devnull }
259 a0d146ed 2005-07-12 devnull
260 a0d146ed 2005-07-12 devnull int
261 a0d146ed 2005-07-12 devnull okamap(AMap *am, int n, u64int start, u64int stop, char *what)
262 a0d146ed 2005-07-12 devnull {
263 a0d146ed 2005-07-12 devnull u64int last;
264 a0d146ed 2005-07-12 devnull u32int i;
265 a0d146ed 2005-07-12 devnull
266 a0d146ed 2005-07-12 devnull last = start;
267 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++){
268 a0d146ed 2005-07-12 devnull if(am[i].start < last){
269 a0d146ed 2005-07-12 devnull if(i == 0)
270 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "invalid start address in %s", what);
271 a0d146ed 2005-07-12 devnull else
272 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "overlapping ranges in %s", what);
273 a0d146ed 2005-07-12 devnull return -1;
274 a0d146ed 2005-07-12 devnull }
275 a0d146ed 2005-07-12 devnull if(am[i].stop < am[i].start){
276 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "invalid range in %s", what);
277 a0d146ed 2005-07-12 devnull return -1;
278 a0d146ed 2005-07-12 devnull }
279 a0d146ed 2005-07-12 devnull last = am[i].stop;
280 a0d146ed 2005-07-12 devnull }
281 a0d146ed 2005-07-12 devnull if(last > stop){
282 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "invalid ending address in %s", what);
283 a0d146ed 2005-07-12 devnull return -1;
284 a0d146ed 2005-07-12 devnull }
285 a0d146ed 2005-07-12 devnull return 0;
286 a0d146ed 2005-07-12 devnull }
287 a0d146ed 2005-07-12 devnull
288 a0d146ed 2005-07-12 devnull int
289 a0d146ed 2005-07-12 devnull maparenas(AMap *am, Arena **arenas, int n, char *what)
290 a0d146ed 2005-07-12 devnull {
291 a0d146ed 2005-07-12 devnull u32int i;
292 a0d146ed 2005-07-12 devnull
293 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++){
294 a0d146ed 2005-07-12 devnull arenas[i] = findarena(am[i].name);
295 a0d146ed 2005-07-12 devnull if(arenas[i] == nil){
296 a0d146ed 2005-07-12 devnull seterr(EAdmin, "can't find arena '%s' for '%s'\n", am[i].name, what);
297 a0d146ed 2005-07-12 devnull return -1;
298 a0d146ed 2005-07-12 devnull }
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 readarenamap(AMapN *amn, Part *part, u64int base, u32int size)
305 a0d146ed 2005-07-12 devnull {
306 a0d146ed 2005-07-12 devnull IFile f;
307 a0d146ed 2005-07-12 devnull u32int ok;
308 a0d146ed 2005-07-12 devnull
309 a0d146ed 2005-07-12 devnull if(partifile(&f, part, base, size) < 0)
310 a0d146ed 2005-07-12 devnull return -1;
311 a0d146ed 2005-07-12 devnull ok = parseamap(&f, amn);
312 a0d146ed 2005-07-12 devnull freeifile(&f);
313 a0d146ed 2005-07-12 devnull return ok;
314 a0d146ed 2005-07-12 devnull }
315 a0d146ed 2005-07-12 devnull
316 a0d146ed 2005-07-12 devnull int
317 a0d146ed 2005-07-12 devnull wbarenamap(AMap *am, int n, Part *part, u64int base, u64int size)
318 a0d146ed 2005-07-12 devnull {
319 a0d146ed 2005-07-12 devnull Fmt f;
320 a0d146ed 2005-07-12 devnull ZBlock *b;
321 a0d146ed 2005-07-12 devnull
322 a0d146ed 2005-07-12 devnull b = alloczblock(size, 1, part->blocksize);
323 a0d146ed 2005-07-12 devnull if(b == nil)
324 a0d146ed 2005-07-12 devnull return -1;
325 a0d146ed 2005-07-12 devnull
326 a0d146ed 2005-07-12 devnull fmtzbinit(&f, b);
327 a0d146ed 2005-07-12 devnull
328 a0d146ed 2005-07-12 devnull if(outputamap(&f, am, n) < 0){
329 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "arena set size too small");
330 a0d146ed 2005-07-12 devnull freezblock(b);
331 a0d146ed 2005-07-12 devnull return -1;
332 a0d146ed 2005-07-12 devnull }
333 e46cacb0 2007-04-27 devnull if(writepart(part, base, b->data, size) < 0 || flushpart(part) < 0){
334 a0d146ed 2005-07-12 devnull seterr(EAdmin, "can't write arena set: %r");
335 a0d146ed 2005-07-12 devnull freezblock(b);
336 a0d146ed 2005-07-12 devnull return -1;
337 a0d146ed 2005-07-12 devnull }
338 a0d146ed 2005-07-12 devnull freezblock(b);
339 a0d146ed 2005-07-12 devnull return 0;
340 a0d146ed 2005-07-12 devnull }
341 a0d146ed 2005-07-12 devnull
342 a0d146ed 2005-07-12 devnull /*
343 a0d146ed 2005-07-12 devnull * amap: n '\n' amapelem * n
344 a0d146ed 2005-07-12 devnull * n: u32int
345 28b49df3 2006-07-18 devnull * amapelem: name '\t' astart '\t' astop '\n'
346 28b49df3 2006-07-18 devnull * astart, astop: u64int
347 a0d146ed 2005-07-12 devnull */
348 a0d146ed 2005-07-12 devnull int
349 a0d146ed 2005-07-12 devnull parseamap(IFile *f, AMapN *amn)
350 a0d146ed 2005-07-12 devnull {
351 a0d146ed 2005-07-12 devnull AMap *am;
352 a0d146ed 2005-07-12 devnull u64int v64;
353 a0d146ed 2005-07-12 devnull u32int v;
354 a0d146ed 2005-07-12 devnull char *s, *t, *flds[4];
355 a0d146ed 2005-07-12 devnull int i, n;
356 a0d146ed 2005-07-12 devnull
357 a0d146ed 2005-07-12 devnull /*
358 a0d146ed 2005-07-12 devnull * arenas
359 a0d146ed 2005-07-12 devnull */
360 a0d146ed 2005-07-12 devnull if(ifileu32int(f, &v) < 0){
361 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "syntax error: bad number of elements in %s", f->name);
362 a0d146ed 2005-07-12 devnull return -1;
363 a0d146ed 2005-07-12 devnull }
364 a0d146ed 2005-07-12 devnull n = v;
365 a0d146ed 2005-07-12 devnull if(n > MaxAMap){
366 f5a8ea6f 2011-06-02 rsc seterr(ECorrupt, "illegal number of elements %d in %s",
367 f5a8ea6f 2011-06-02 rsc n, f->name);
368 a0d146ed 2005-07-12 devnull return -1;
369 a0d146ed 2005-07-12 devnull }
370 a0d146ed 2005-07-12 devnull am = MKNZ(AMap, n);
371 a0d146ed 2005-07-12 devnull if(am == nil){
372 a0d146ed 2005-07-12 devnull fprint(2, "out of memory\n");
373 a0d146ed 2005-07-12 devnull return -1;
374 a0d146ed 2005-07-12 devnull }
375 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++){
376 a0d146ed 2005-07-12 devnull s = ifileline(f);
377 a0d146ed 2005-07-12 devnull if(s)
378 a0d146ed 2005-07-12 devnull t = estrdup(s);
379 a0d146ed 2005-07-12 devnull else
380 a0d146ed 2005-07-12 devnull t = nil;
381 a0d146ed 2005-07-12 devnull if(s == nil || getfields(s, flds, 4, 0, "\t") != 3){
382 a0d146ed 2005-07-12 devnull fprint(2, "early eof after %d of %d, %s:#%d: %s\n", i, n, f->name, f->pos, t);
383 a0d146ed 2005-07-12 devnull free(t);
384 a0d146ed 2005-07-12 devnull return -1;
385 a0d146ed 2005-07-12 devnull }
386 a0d146ed 2005-07-12 devnull free(t);
387 a0d146ed 2005-07-12 devnull if(nameok(flds[0]) < 0)
388 a0d146ed 2005-07-12 devnull return -1;
389 a0d146ed 2005-07-12 devnull namecp(am[i].name, flds[0]);
390 a0d146ed 2005-07-12 devnull if(stru64int(flds[1], &v64) < 0){
391 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "syntax error: bad arena base address in %s", f->name);
392 a0d146ed 2005-07-12 devnull free(am);
393 a0d146ed 2005-07-12 devnull return -1;
394 a0d146ed 2005-07-12 devnull }
395 a0d146ed 2005-07-12 devnull am[i].start = v64;
396 a0d146ed 2005-07-12 devnull if(stru64int(flds[2], &v64) < 0){
397 a0d146ed 2005-07-12 devnull seterr(ECorrupt, "syntax error: bad arena size in %s", f->name);
398 a0d146ed 2005-07-12 devnull free(am);
399 a0d146ed 2005-07-12 devnull return -1;
400 a0d146ed 2005-07-12 devnull }
401 a0d146ed 2005-07-12 devnull am[i].stop = v64;
402 a0d146ed 2005-07-12 devnull }
403 a0d146ed 2005-07-12 devnull
404 a0d146ed 2005-07-12 devnull amn->map = am;
405 a0d146ed 2005-07-12 devnull amn->n = n;
406 a0d146ed 2005-07-12 devnull return 0;
407 a0d146ed 2005-07-12 devnull }
408 a0d146ed 2005-07-12 devnull
409 a0d146ed 2005-07-12 devnull int
410 a0d146ed 2005-07-12 devnull outputamap(Fmt *f, AMap *am, int n)
411 a0d146ed 2005-07-12 devnull {
412 a0d146ed 2005-07-12 devnull int i;
413 a0d146ed 2005-07-12 devnull
414 a0d146ed 2005-07-12 devnull if(fmtprint(f, "%ud\n", n) < 0)
415 a0d146ed 2005-07-12 devnull return -1;
416 a0d146ed 2005-07-12 devnull for(i = 0; i < n; i++)
417 a0d146ed 2005-07-12 devnull if(fmtprint(f, "%s\t%llud\t%llud\n", am[i].name, am[i].start, am[i].stop) < 0)
418 a0d146ed 2005-07-12 devnull return -1;
419 a0d146ed 2005-07-12 devnull return 0;
420 a0d146ed 2005-07-12 devnull }