Commit | Line | Data |
463ee0b2 |
1 | /* |
2 | * dba dbm analysis/recovery |
3 | */ |
4 | |
5 | #include <stdio.h> |
6 | #include <sys/file.h> |
17f28c40 |
7 | #include "EXTERN.h" |
463ee0b2 |
8 | #include "sdbm.h" |
9 | |
10 | char *progname; |
11 | extern void oops(); |
12 | |
13 | int |
ba106d47 |
14 | main(int argc, char **argv) |
463ee0b2 |
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 |
25 | if (!name) |
26 | oops("cannot get memory"); |
27 | |
463ee0b2 |
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 |
42 | void |
43 | sdump(int pagf) |
463ee0b2 |
44 | { |
45 | register b; |
46 | register n = 0; |
47 | register t = 0; |
48 | register o = 0; |
49 | register e; |
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 |
72 | int |
73 | pagestat(char *pag) |
463ee0b2 |
74 | { |
75 | register n; |
76 | register free; |
77 | register short *ino = (short *) pag; |
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 | } |