Blob


1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
5 enum
6 {
7 ClumpChunks = 32*1024
8 };
10 static int verbose;
12 int
13 clumpinfoeq(ClumpInfo *c, ClumpInfo *d)
14 {
15 return c->type == d->type
16 && c->size == d->size
17 && c->uncsize == d->uncsize
18 && scorecmp(c->score, d->score)==0;
19 }
21 int
22 findscore(Arena *arena, uchar *score)
23 {
24 IEntry ie;
25 ClumpInfo *ci, *cis;
26 u64int a;
27 u32int clump;
28 int i, n, found;
30 //ZZZ remove fprint?
31 if(arena->memstats.clumps)
32 fprint(2, "reading directory for arena=%s with %d entries\n",
33 arena->name, arena->memstats.clumps);
35 cis = MKN(ClumpInfo, ClumpChunks);
36 found = 0;
37 a = 0;
38 memset(&ie, 0, sizeof(IEntry));
39 for(clump = 0; clump < arena->memstats.clumps; clump += n){
40 n = ClumpChunks;
41 if(n > arena->memstats.clumps - clump)
42 n = arena->memstats.clumps - clump;
43 if(readclumpinfos(arena, clump, cis, n) != n){
44 seterr(EOk, "arena directory read failed: %r");
45 break;
46 }
48 for(i = 0; i < n; i++){
49 ci = &cis[i];
50 if(scorecmp(score, ci->score)==0){
51 fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",
52 clump + i, ci->type, ci->uncsize, ci->size, a);
53 found++;
54 }
55 a += ci->size + ClumpSize;
56 }
57 }
58 free(cis);
59 return found;
60 }
62 void
63 usage(void)
64 {
65 fprint(2, "usage: findscore [-v] arenafile score\n");
66 threadexitsall(0);
67 }
69 void
70 threadmain(int argc, char *argv[])
71 {
72 ArenaPart *ap;
73 Part *part;
74 char *file;
75 u8int score[VtScoreSize];
76 int i, found;
78 ventifmtinstall();
80 ARGBEGIN{
81 case 'v':
82 verbose++;
83 break;
84 default:
85 usage();
86 break;
87 }ARGEND
89 readonly = 1;
91 if(argc != 2)
92 usage();
94 file = argv[0];
95 if(strscore(argv[1], score) < 0)
96 sysfatal("bad score %s", argv[1]);
98 part = initpart(file, OREAD|ODIRECT);
99 if(part == nil)
100 sysfatal("can't open partition %s: %r", file);
102 ap = initarenapart(part);
103 if(ap == nil)
104 sysfatal("can't initialize arena partition in %s: %r", file);
106 if(verbose > 1){
107 printarenapart(2, ap);
108 fprint(2, "\n");
111 initdcache(8 * MaxDiskBlock);
113 found = 0;
114 for(i = 0; i < ap->narenas; i++)
115 found += findscore(ap->arenas[i], score);
117 print("found %d occurrences of %V\n", found, score);
119 if(verbose > 1)
120 printstats();
121 threadexitsall(0);