9f987fd88e799740102cb35bf1228f80e5383ac1
[p5sagit/p5-mst-13.2.git] / ext / SDBM_File / sdbm / dba.c
1 /*
2  * dba  dbm analysis/recovery
3  */
4
5 #include <stdio.h>
6 #include <sys/file.h>
7 #include "EXTERN.h"
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                 if (!name)
27                     oops("cannot get memory");
28
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 }