This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.000
[perl5.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 "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 }