plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

printarenapart.c (3548B)


      1 #include "stdinc.h"
      2 #include "dat.h"
      3 #include "fns.h"
      4 
      5 uchar buf[64*1024];
      6 
      7 void
      8 usage(void)
      9 {
     10 	fprint(2, "usage: printarenapart arenafile [offset]\n");
     11 	threadexitsall("usage");
     12 }
     13 
     14 /* unused */
     15 void
     16 rdarena(Arena *arena, u64int offset)
     17 {
     18 	u64int a, aa, e;
     19 	u32int magic;
     20 	Clump cl;
     21 	uchar score[VtScoreSize];
     22 	ZBlock *lump;
     23 
     24 	printarena(2, arena);
     25 
     26 	a = arena->base;
     27 	e = arena->base + arena->size;
     28 	if(offset != ~(u64int)0) {
     29 		if(offset >= e-a)
     30 			sysfatal("bad offset %llud >= %llud",
     31 				offset, e-a);
     32 		aa = offset;
     33 	} else
     34 		aa = 0;
     35 
     36 	for(; aa < e; aa += ClumpSize+cl.info.size) {
     37 		magic = clumpmagic(arena, aa);
     38 		if(magic == ClumpFreeMagic)
     39 			break;
     40 		if(magic != arena->clumpmagic) {
     41 			fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
     42 				magic, aa);
     43 			break;
     44 		}
     45 		lump = loadclump(arena, aa, 0, &cl, score, 0);
     46 		if(lump == nil) {
     47 			fprint(2, "clump %llud failed to read: %r\n", aa);
     48 			break;
     49 		}
     50 		if(cl.info.type != VtCorruptType) {
     51 			scoremem(score, lump->data, cl.info.uncsize);
     52 			if(scorecmp(cl.info.score, score) != 0) {
     53 				fprint(2, "clump %llud has mismatched score\n", aa);
     54 				break;
     55 			}
     56 			if(vttypevalid(cl.info.type) < 0) {
     57 				fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
     58 				break;
     59 			}
     60 		}
     61 		print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
     62 		freezblock(lump);
     63 	}
     64 	print("end offset %llud\n", aa);
     65 }
     66 
     67 void
     68 threadmain(int argc, char *argv[])
     69 {
     70 	char *file, *p, *name;
     71 	char *table;
     72 	u64int offset;
     73 	Part *part;
     74 	ArenaPart ap;
     75 	ArenaHead head;
     76 	Arena tail;
     77 	char ct[40], mt[40];
     78 
     79 	readonly = 1;	/* for part.c */
     80 	ARGBEGIN{
     81 	default:
     82 		usage();
     83 		break;
     84 	}ARGEND
     85 
     86 	switch(argc) {
     87 	default:
     88 		usage();
     89 	case 1:
     90 		file = argv[0];
     91 	}
     92 
     93 	ventifmtinstall();
     94 	statsinit();
     95 
     96 	part = initpart(file, OREAD|ODIRECT);
     97 	if(part == nil)
     98 		sysfatal("can't open file %s: %r", file);
     99 	if(readpart(part, PartBlank, buf, sizeof buf) < 0)
    100 		sysfatal("can't read file %s: %r", file);
    101 
    102 	if(unpackarenapart(&ap, buf) < 0)
    103 		sysfatal("corrupted arena part header: %r");
    104 
    105 	print("# arena part version=%d blocksize=%d arenabase=%d\n",
    106 		ap.version, ap.blocksize, ap.arenabase);
    107 	ap.tabbase = (PartBlank+HeadSize+ap.blocksize-1)&~(ap.blocksize-1);
    108 	ap.tabsize = ap.arenabase - ap.tabbase;
    109 
    110 	table = malloc(ap.tabsize+1);
    111 	if(readpart(part, ap.tabbase, (uchar*)table, ap.tabsize) < 0)
    112 		sysfatal("read %s: %r", file);
    113 	table[ap.tabsize] = 0;
    114 
    115 	partblocksize(part, ap.blocksize);
    116 	initdcache(8 * MaxDiskBlock);
    117 
    118 	for(p=table; p && *p; p=strchr(p, '\n')){
    119 		if(*p == '\n')
    120 			p++;
    121 		name = p;
    122 		p = strpbrk(p, " \t");
    123 		if(p == nil){
    124 			fprint(2, "bad line: %s\n", name);
    125 			break;
    126 		}
    127 		offset = strtoull(p, nil, 0);
    128 		if(readpart(part, offset, buf, sizeof buf) < 0){
    129 			fprint(2, "%s: read %s: %r\n", argv0, file);
    130 			continue;
    131 		}
    132 		if(unpackarenahead(&head, buf) < 0){
    133 			fprint(2, "%s: unpackarenahead: %r\n", argv0);
    134 			continue;
    135 		}
    136 		if(readpart(part, offset+head.size-head.blocksize, buf, head.blocksize) < 0){
    137 			fprint(2, "%s: read %s: %r\n", argv0, file);
    138 			continue;
    139 		}
    140 		if(unpackarena(&tail, buf) < 0){
    141 			fprint(2, "%s: unpackarena: %r\n", argv0);
    142 			continue;
    143 		}
    144 		print("arena %s %lld clumps=%,d cclumps=%,d used=%,lld uncsize=%,lld%s\n",
    145 			tail.name, offset,
    146 			tail.diskstats.clumps, tail.diskstats.cclumps,
    147 			tail.diskstats.used, tail.diskstats.uncsize,
    148 			tail.diskstats.sealed ? " sealed" : "");
    149 		strcpy(ct, ctime(tail.ctime));
    150 		ct[28] = 0;
    151 		strcpy(mt, ctime(tail.wtime));
    152 		mt[28] = 0;
    153 		print("\tctime=%s\n\tmtime=%s\n", ct, mt);
    154 	}
    155 	threadexitsall(0);
    156 }