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