xref: /plan9/sys/src/cmd/fossil/flchk.c (revision 282e677fa45fb578cdb8bc2c412ac084c367776e)
1 #include "stdinc.h"
2 #include <bio.h>
3 #include "dat.h"
4 #include "fns.h"
5 
6 Biobuf bout;
7 Fsck fsck;
8 
9 static void
10 usage(void)
11 {
12 	fprint(2, "usage: %s [-c cachesize] [-h host] file\n", argv0);
13 	exits("usage");
14 }
15 
16 static int
17 flprint(char *fmt, ...)
18 {
19 	int n;
20 	va_list arg;
21 
22 	va_start(arg, fmt);
23 	n = Bvprint(&bout, fmt, arg);
24 	va_end(arg);
25 	return n;
26 }
27 
28 static void
29 flclre(Fsck*, Block *b, int o)
30 {
31 	Bprint(&bout, "# clre 0x%ux %d\n", b->addr, o);
32 }
33 
34 static void
35 flclrp(Fsck*, Block *b, int o)
36 {
37 	Bprint(&bout, "# clrp 0x%ux %d\n", b->addr, o);
38 }
39 
40 static void
41 flclri(Fsck*, char *name, MetaBlock*, int, Block*)
42 {
43 	Bprint(&bout, "# clri %s\n", name);
44 }
45 
46 static void
47 flclose(Fsck*, Block *b, u32int epoch)
48 {
49 	Bprint(&bout, "# bclose 0x%ux %ud\n", b->addr, epoch);
50 }
51 
52 void
53 main(int argc, char *argv[])
54 {
55 	int csize = 1000;
56 	VtSession *z;
57 	char *host = nil;
58 
59 	fsck.useventi = 1;
60 	Binit(&bout, 1, OWRITE);
61 	ARGBEGIN{
62 	default:
63 		usage();
64 	case 'c':
65 		csize = atoi(ARGF());
66 		if(csize <= 0)
67 			usage();
68 		break;
69 	case 'f':
70 		fsck.useventi = 0;
71 		break;
72 	case 'h':
73 		host = ARGF();
74 		break;
75 	case 'v':
76 		fsck.printdirs = 1;
77 		break;
78 	}ARGEND;
79 
80 	if(argc != 1)
81 		usage();
82 
83 	vtAttach();
84 
85 	fmtinstall('L', labelFmt);
86 	fmtinstall('V', scoreFmt);
87 	fmtinstall('R', vtErrFmt);
88 
89 	/*
90 	 * Connect to Venti.
91 	 */
92 	z = vtDial(host, 0);
93 	if(z == nil){
94 		if(fsck.useventi)
95 			vtFatal("could not connect to server: %s", vtGetError());
96 	}else if(!vtConnect(z, 0))
97 		vtFatal("vtConnect: %s", vtGetError());
98 
99 	/*
100 	 * Initialize file system.
101 	 */
102 	fsck.fs = fsOpen(argv[0], z, csize, OReadOnly);
103 	if(fsck.fs == nil)
104 		vtFatal("could not open file system: %R");
105 
106 	fsck.print = flprint;
107 	fsck.clre = flclre;
108 	fsck.clrp = flclrp;
109 	fsck.close = flclose;
110 	fsck.clri = flclri;
111 
112 	fsCheck(&fsck);
113 
114 	exits(0);
115 }
116 
117