#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); threadexitsall("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 *chk, Block *b, int o) { USED(chk); Bprint(&bout, "# clre 0x%ux %d\n", b->addr, o); } static void flclrp(Fsck *chk, Block *b, int o) { USED(chk); Bprint(&bout, "# clrp 0x%ux %d\n", b->addr, o); } static void flclri(Fsck *chk, char *name, MetaBlock *mb, int i, Block *b) { USED(chk); USED(mb); USED(i); USED(b); Bprint(&bout, "# clri %s\n", name); } static void flclose(Fsck *chk, Block *b, u32int epoch) { USED(chk); Bprint(&bout, "# bclose 0x%ux %ud\n", b->addr, epoch); } void threadmain(int argc, char *argv[]) { int csize = 1000; VtConn *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(); fmtinstall('L', labelFmt); fmtinstall('V', scoreFmt); /* * Connect to Venti. */ z = vtdial(host); if(z == nil){ if(fsck.useventi) sysfatal("could not connect to server: %r"); }else if(vtconnect(z) < 0) sysfatal("vtconnect: %r"); /* * Initialize file system. */ fsck.fs = fsOpen(argv[0], z, csize, OReadOnly); if(fsck.fs == nil) sysfatal("could not open file system: %r"); fsck.print = flprint; fsck.clre = flclre; fsck.clrp = flclrp; fsck.close = flclose; fsck.clri = flclri; fsCheck(&fsck); threadexitsall(0); }