diff options
author | rsc <devnull@localhost> | 2006-07-18 15:26:33 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2006-07-18 15:26:33 +0000 |
commit | 28b49df3542a635cca788f3de213385f3fcb6334 (patch) | |
tree | a3a30774249929e66988bf77e76df9459acb50bc /src/cmd/venti/srv/printarenapart.c | |
parent | 686bd37d9d8db5e3b969a3aa2d5b455e0976b262 (diff) | |
download | plan9port-28b49df3542a635cca788f3de213385f3fcb6334.tar.gz plan9port-28b49df3542a635cca788f3de213385f3fcb6334.tar.bz2 plan9port-28b49df3542a635cca788f3de213385f3fcb6334.zip |
assorted changes from Plan 9
Diffstat (limited to 'src/cmd/venti/srv/printarenapart.c')
-rw-r--r-- | src/cmd/venti/srv/printarenapart.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/printarenapart.c b/src/cmd/venti/srv/printarenapart.c new file mode 100644 index 00000000..25418beb --- /dev/null +++ b/src/cmd/venti/srv/printarenapart.c @@ -0,0 +1,160 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +uchar buf[64*1024]; + +void +usage(void) +{ + fprint(2, "usage: printarenapart arenafile [offset]\n"); + threadexitsall("usage"); +} + +static void +rdarena(Arena *arena, u64int offset) +{ + u64int a, aa, e; + u32int magic; + Clump cl; + uchar score[VtScoreSize]; + ZBlock *lump; + + printarena(2, arena); + + a = arena->base; + e = arena->base + arena->size; + if(offset != ~(u64int)0) { + if(offset >= e-a) + sysfatal("bad offset %llud >= %llud\n", + offset, e-a); + aa = offset; + } else + aa = 0; + + for(; aa < e; aa += ClumpSize+cl.info.size) { + magic = clumpmagic(arena, aa); + if(magic == ClumpFreeMagic) + break; + if(magic != arena->clumpmagic) { + fprint(2, "illegal clump magic number %#8.8ux offset %llud\n", + magic, aa); + break; + } + lump = loadclump(arena, aa, 0, &cl, score, 0); + if(lump == nil) { + fprint(2, "clump %llud failed to read: %r\n", aa); + break; + } + if(cl.info.type != VtCorruptType) { + scoremem(score, lump->data, cl.info.uncsize); + if(scorecmp(cl.info.score, score) != 0) { + fprint(2, "clump %llud has mismatched score\n", aa); + break; + } + if(vttypevalid(cl.info.type) < 0) { + fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type); + break; + } + } + print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize); + freezblock(lump); + } + print("end offset %llud\n", aa); +} + +void +threadmain(int argc, char *argv[]) +{ + char *file, *p, *name; + char *table; + u64int offset; + Part *part; + ArenaPart ap; + ArenaHead head; + Arena tail; + char ct[40], mt[40]; + + readonly = 1; /* for part.c */ + ARGBEGIN{ + default: + usage(); + break; + }ARGEND + + switch(argc) { + default: + usage(); + case 1: + file = argv[0]; + } + + ventifmtinstall(); + statsinit(); + + part = initpart(file, OREAD|ODIRECT); + if(part == nil) + sysfatal("can't open file %s: %r", file); + if(readpart(part, PartBlank, buf, sizeof buf) < 0) + sysfatal("can't read file %s: %r", file); + + if(unpackarenapart(&ap, buf) < 0) + sysfatal("corrupted arena part header: %r"); + + print("# arena part version=%d blocksize=%d arenabase=%d\n", + ap.version, ap.blocksize, ap.arenabase); + ap.tabbase = (PartBlank+HeadSize+ap.blocksize-1)&~(ap.blocksize-1); + ap.tabsize = ap.arenabase - ap.tabbase; + +print("A"); + table = malloc(ap.tabsize+1); + if(readpart(part, ap.tabbase, (uchar*)table, ap.tabsize) < 0) + sysfatal("read %s: %r", file); + table[ap.tabsize] = 0; + +print("A"); + partblocksize(part, ap.blocksize); + initdcache(8 * MaxDiskBlock); + +print("A"); +/* XXX - read the number of arenas from the first line */ + for(p=table; p && *p; p=strchr(p, '\n')){ + if(*p == '\n') + p++; + name = p; + p = strpbrk(p, " \t"); + if(p == nil){ + fprint(2, "bad line: %s\n", name); + break; + } +print("%p\n", p); + offset = strtoull(p, nil, 0); + if(readpart(part, offset, buf, sizeof buf) < 0){ + fprint(2, "%s: read %s: %r\n", argv0, file); + continue; + } + if(unpackarenahead(&head, buf) < 0){ + fprint(2, "%s: unpackarenahead: %r\n", argv0); + continue; + } + if(readpart(part, offset+head.size-head.blocksize, buf, head.blocksize) < 0){ + fprint(2, "%s: read %s: %r\n", argv0, file); + continue; + } + if(unpackarena(&tail, buf) < 0){ + fprint(2, "%s: unpackarena: %r\n", argv0); + continue; + } + print("arena %s %lld clumps=%,d cclumps=%,d used=%,lld uncsize=%,lld%s\n", + tail.name, offset, + tail.diskstats.clumps, tail.diskstats.cclumps, + tail.diskstats.used, tail.diskstats.uncsize, + tail.diskstats.sealed ? " sealed" : ""); + strcpy(ct, ctime(tail.ctime)); + ct[28] = 0; + strcpy(mt, ctime(tail.wtime)); + mt[28] = 0; + print("\tctime=%s\n\tmtime=%s\n", ct, mt); + } + threadexitsall(0); +} |