xref: /openbsd/gnu/usr.bin/perl/ext/SDBM_File/dba.c (revision 256a93a4)
1*b8851fccSafresh1 /*
2*b8851fccSafresh1  * dba	dbm analysis/recovery
3*b8851fccSafresh1  */
4*b8851fccSafresh1 
5*b8851fccSafresh1 #include <stdio.h>
6*b8851fccSafresh1 #include <sys/file.h>
7*b8851fccSafresh1 #include "EXTERN.h"
8*b8851fccSafresh1 #include "sdbm.h"
9*b8851fccSafresh1 
10*b8851fccSafresh1 char *progname;
11*b8851fccSafresh1 extern void oops();
12*b8851fccSafresh1 
13*b8851fccSafresh1 int
main(int argc,char ** argv)14*b8851fccSafresh1 main(int argc, char **argv)
15*b8851fccSafresh1 {
16*b8851fccSafresh1         int n;
17*b8851fccSafresh1         char *p;
18*b8851fccSafresh1         char *name;
19*b8851fccSafresh1         int pagf;
20*b8851fccSafresh1 
21*b8851fccSafresh1         progname = argv[0];
22*b8851fccSafresh1 
23*b8851fccSafresh1         if (p = argv[1]) {
24*b8851fccSafresh1                 name = (char *) malloc((n = strlen(p)) + 5);
25*b8851fccSafresh1                 if (!name)
26*b8851fccSafresh1                     oops("cannot get memory");
27*b8851fccSafresh1 
28*b8851fccSafresh1                 strcpy(name, p);
29*b8851fccSafresh1                 strcpy(name + n, ".pag");
30*b8851fccSafresh1 
31*b8851fccSafresh1                 if ((pagf = open(name, O_RDONLY)) < 0)
32*b8851fccSafresh1                         oops("cannot open %s.", name);
33*b8851fccSafresh1 
34*b8851fccSafresh1                 sdump(pagf);
35*b8851fccSafresh1         }
36*b8851fccSafresh1         else
37*b8851fccSafresh1                 oops("usage: %s dbname", progname);
38*b8851fccSafresh1 
39*b8851fccSafresh1         return 0;
40*b8851fccSafresh1 }
41*b8851fccSafresh1 
42*b8851fccSafresh1 void
sdump(int pagf)43*b8851fccSafresh1 sdump(int pagf)
44*b8851fccSafresh1 {
45*b8851fccSafresh1         int b;
46*b8851fccSafresh1         int n = 0;
47*b8851fccSafresh1         int t = 0;
48*b8851fccSafresh1         int o = 0;
49*b8851fccSafresh1         int e;
50*b8851fccSafresh1         char pag[PBLKSIZ];
51*b8851fccSafresh1 
52*b8851fccSafresh1         while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
53*b8851fccSafresh1                 printf("#%d: ", n);
54*b8851fccSafresh1                 if (!okpage(pag))
55*b8851fccSafresh1                         printf("bad\n");
56*b8851fccSafresh1                 else {
57*b8851fccSafresh1                         printf("ok. ");
58*b8851fccSafresh1                         if (!(e = pagestat(pag)))
59*b8851fccSafresh1                             o++;
60*b8851fccSafresh1                         else
61*b8851fccSafresh1                             t += e;
62*b8851fccSafresh1                 }
63*b8851fccSafresh1                 n++;
64*b8851fccSafresh1         }
65*b8851fccSafresh1 
66*b8851fccSafresh1         if (b == 0)
67*b8851fccSafresh1                 printf("%d pages (%d holes):  %d entries\n", n, o, t);
68*b8851fccSafresh1         else
69*b8851fccSafresh1                 oops("read failed: block %d", n);
70*b8851fccSafresh1 }
71*b8851fccSafresh1 
72*b8851fccSafresh1 int
pagestat(char * pag)73*b8851fccSafresh1 pagestat(char *pag)
74*b8851fccSafresh1 {
75*b8851fccSafresh1         int n;
76*b8851fccSafresh1         int free;
77*b8851fccSafresh1         short *ino = (short *) pag;
78*b8851fccSafresh1 
79*b8851fccSafresh1         if (!(n = ino[0]))
80*b8851fccSafresh1                 printf("no entries.\n");
81*b8851fccSafresh1         else {
82*b8851fccSafresh1                 free = ino[n] - (n + 1) * sizeof(short);
83*b8851fccSafresh1                 printf("%3d entries %2d%% used free %d.\n",
84*b8851fccSafresh1                        n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
85*b8851fccSafresh1         }
86*b8851fccSafresh1         return n / 2;
87*b8851fccSafresh1 }
88