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 |
14 | main(argc, argv) |
15 | char **argv; |
16 | { |
17 | int n; |
18 | char *p; |
19 | char *name; |
20 | int pagf; |
21 | |
22 | progname = argv[0]; |
23 | |
24 | if (p = argv[1]) { |
25 | name = (char *) malloc((n = strlen(p)) + 5); |
26 | strcpy(name, p); |
27 | strcpy(name + n, ".pag"); |
28 | |
29 | if ((pagf = open(name, O_RDONLY)) < 0) |
30 | oops("cannot open %s.", name); |
31 | |
32 | sdump(pagf); |
33 | } |
34 | else |
35 | oops("usage: %s dbname", progname); |
36 | |
37 | return 0; |
38 | } |
39 | |
40 | sdump(pagf) |
41 | int pagf; |
42 | { |
43 | register b; |
44 | register n = 0; |
45 | register t = 0; |
46 | register o = 0; |
47 | register e; |
48 | char pag[PBLKSIZ]; |
49 | |
50 | while ((b = read(pagf, pag, PBLKSIZ)) > 0) { |
51 | printf("#%d: ", n); |
52 | if (!okpage(pag)) |
53 | printf("bad\n"); |
54 | else { |
55 | printf("ok. "); |
56 | if (!(e = pagestat(pag))) |
57 | o++; |
58 | else |
59 | t += e; |
60 | } |
61 | n++; |
62 | } |
63 | |
64 | if (b == 0) |
65 | printf("%d pages (%d holes): %d entries\n", n, o, t); |
66 | else |
67 | oops("read failed: block %d", n); |
68 | } |
69 | |
70 | pagestat(pag) |
71 | char *pag; |
72 | { |
73 | register n; |
74 | register free; |
75 | register short *ino = (short *) pag; |
76 | |
77 | if (!(n = ino[0])) |
78 | printf("no entries.\n"); |
79 | else { |
80 | free = ino[n] - (n + 1) * sizeof(short); |
81 | printf("%3d entries %2d%% used free %d.\n", |
82 | n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free); |
83 | } |
84 | return n / 2; |
85 | } |