Initial import from FreeBSD RELENG_4:
[games.git] / contrib / perl5 / 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                 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 }