Commit | Line | Data |
---|---|---|
463ee0b2 LW |
1 | /* |
2 | * dba dbm analysis/recovery | |
3 | */ | |
4 | ||
5 | #include <stdio.h> | |
6 | #include <sys/file.h> | |
17f28c40 | 7 | #include "EXTERN.h" |
463ee0b2 LW |
8 | #include "sdbm.h" |
9 | ||
10 | char *progname; | |
11 | extern void oops(); | |
12 | ||
13 | int | |
ba106d47 | 14 | main(int argc, char **argv) |
463ee0b2 LW |
15 | { |
16 | int n; | |
17 | char *p; | |
18 | char *name; | |
19 | int pagf; | |
20 | ||
21 | progname = argv[0]; | |
22 | ||
23 | if (p = argv[1]) { | |
24 | name = (char *) malloc((n = strlen(p)) + 5); | |
db7c17d7 GS |
25 | if (!name) |
26 | oops("cannot get memory"); | |
27 | ||
463ee0b2 LW |
28 | strcpy(name, p); |
29 | strcpy(name + n, ".pag"); | |
30 | ||
31 | if ((pagf = open(name, O_RDONLY)) < 0) | |
32 | oops("cannot open %s.", name); | |
33 | ||
34 | sdump(pagf); | |
35 | } | |
36 | else | |
37 | oops("usage: %s dbname", progname); | |
38 | ||
39 | return 0; | |
40 | } | |
41 | ||
ba106d47 GS |
42 | void |
43 | sdump(int pagf) | |
463ee0b2 | 44 | { |
5aaab254 KW |
45 | int b; |
46 | int n = 0; | |
47 | int t = 0; | |
48 | int o = 0; | |
49 | int e; | |
463ee0b2 LW |
50 | char pag[PBLKSIZ]; |
51 | ||
52 | while ((b = read(pagf, pag, PBLKSIZ)) > 0) { | |
53 | printf("#%d: ", n); | |
54 | if (!okpage(pag)) | |
55 | printf("bad\n"); | |
56 | else { | |
57 | printf("ok. "); | |
58 | if (!(e = pagestat(pag))) | |
59 | o++; | |
60 | else | |
61 | t += e; | |
62 | } | |
63 | n++; | |
64 | } | |
65 | ||
66 | if (b == 0) | |
67 | printf("%d pages (%d holes): %d entries\n", n, o, t); | |
68 | else | |
69 | oops("read failed: block %d", n); | |
70 | } | |
71 | ||
ba106d47 GS |
72 | int |
73 | pagestat(char *pag) | |
463ee0b2 | 74 | { |
5aaab254 KW |
75 | int n; |
76 | int free; | |
77 | short *ino = (short *) pag; | |
463ee0b2 LW |
78 | |
79 | if (!(n = ino[0])) | |
80 | printf("no entries.\n"); | |
81 | else { | |
82 | free = ino[n] - (n + 1) * sizeof(short); | |
83 | printf("%3d entries %2d%% used free %d.\n", | |
84 | n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free); | |
85 | } | |
86 | return n / 2; | |
87 | } |