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