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