plan9port

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

printindex.c (1746B)


      1 #include "stdinc.h"
      2 #include "dat.h"
      3 #include "fns.h"
      4 #include <bio.h>
      5 
      6 Biobuf bout;
      7 
      8 static void
      9 pie(IEntry *ie)
     10 {
     11 	Bprint(&bout, "%22lld %V %3d %5d\n",
     12 		ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
     13 }
     14 
     15 void
     16 usage(void)
     17 {
     18 	fprint(2, "usage: printindex [-B blockcachesize] config [isectname...]\n");
     19 	threadexitsall(0);
     20 }
     21 
     22 Config conf;
     23 
     24 int
     25 shoulddump(char *name, int argc, char **argv)
     26 {
     27 	int i;
     28 
     29 	if(argc == 0)
     30 		return 1;
     31 	for(i=0; i<argc; i++)
     32 		if(strcmp(name, argv[i]) == 0)
     33 			return 1;
     34 	return 0;
     35 }
     36 
     37 void
     38 dumpisect(ISect *is)
     39 {
     40 	int j;
     41 	uchar *buf;
     42 	u32int i;
     43 	u64int off;
     44 	IBucket ib;
     45 	IEntry ie;
     46 
     47 	buf = emalloc(is->blocksize);
     48 	for(i=0; i<is->blocks; i++){
     49 		off = is->blockbase+(u64int)is->blocksize*i;
     50 		if(readpart(is->part, off, buf, is->blocksize) < 0)
     51 			fprint(2, "read %s at 0x%llux: %r\n", is->part->name, off);
     52 		else{
     53 			unpackibucket(&ib, buf, is->bucketmagic);
     54 			for(j=0; j<ib.n; j++){
     55 				unpackientry(&ie, &ib.data[j*IEntrySize]);
     56 				pie(&ie);
     57 			}
     58 		}
     59 	}
     60 }
     61 
     62 void
     63 threadmain(int argc, char *argv[])
     64 {
     65 	int i;
     66 	Index *ix;
     67 	u32int bcmem;
     68 
     69 	bcmem = 0;
     70 	ARGBEGIN{
     71 	case 'B':
     72 		bcmem = unittoull(ARGF());
     73 		break;
     74 	default:
     75 		usage();
     76 		break;
     77 	}ARGEND
     78 
     79 	if(argc < 1)
     80 		usage();
     81 
     82 	fmtinstall('H', encodefmt);
     83 
     84 	if(initventi(argv[0], &conf) < 0)
     85 		sysfatal("can't init venti: %r");
     86 
     87 	if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
     88 		bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
     89 	if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
     90 	initdcache(bcmem);
     91 
     92 	ix = mainindex;
     93 	Binit(&bout, 1, OWRITE);
     94 	for(i=0; i<ix->nsects; i++)
     95 		if(shoulddump(ix->sects[i]->name, argc-1, argv+1))
     96 			dumpisect(ix->sects[i]);
     97 	Bterm(&bout);
     98 	threadexitsall(0);
     99 }