#include "stdinc.h" #include #include "dat.h" #include "fns.h" Biobuf bout; Fsck fsck; static void usage(void) { fprint(2, "usage: %s [-c cachesize] [-h host] file\n", argv0); exits("usage"); } #pragma varargck argpos flprint 1 static int flprint(char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = Bvprint(&bout, fmt, arg); va_end(arg); return n; } static void flclre(Fsck*, Block *b, int o) { Bprint(&bout, "# clre 0x%ux %d\n", b->addr, o); } static void flclrp(Fsck*, Block *b, int o) { Bprint(&bout, "# clrp 0x%ux %d\n", b->addr, o); } static void flclri(Fsck*, char *name, MetaBlock*, int, Block*) { Bprint(&bout, "# clri %s\n", name); } static void flclose(Fsck*, Block *b, u32int epoch) { Bprint(&bout, "# bclose 0x%ux %ud\n", b->addr, epoch); } void main(int argc, char *argv[]) { int csize = 1000; VtSession *z; char *host = nil; fsck.useventi = 1; Binit(&bout, 1, OWRITE); ARGBEGIN{ default: usage(); case 'c': csize = atoi(ARGF()); if(csize <= 0) usage(); break; case 'f': fsck.useventi = 0; break; case 'h': host = ARGF(); break; case 'v': fsck.printdirs = 1; break; }ARGEND; if(argc != 1) usage(); vtAttach(); fmtinstall('L', labelFmt); fmtinstall('V', scoreFmt); fmtinstall('R', vtErrFmt); /* * Connect to Venti. */ z = vtDial(host, 0); if(z == nil){ if(fsck.useventi) vtFatal("could not connect to server: %s", vtGetError()); }else if(!vtConnect(z, 0)) vtFatal("vtConnect: %s", vtGetError()); /* * Initialize file system. */ fsck.fs = fsOpen(argv[0], z, csize, OReadOnly); if(fsck.fs == nil) vtFatal("could not open file system: %R"); fsck.print = flprint; fsck.clre = flclre; fsck.clrp = flclrp; fsck.close = flclose; fsck.clri = flclri; fsCheck(&fsck); exits(0); }