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