15e96a66cSDavid du Colombier #include "stdinc.h" 2e569ccb5SDavid du Colombier #include <bio.h> 35e96a66cSDavid du Colombier #include "dat.h" 45e96a66cSDavid du Colombier #include "fns.h" 55e96a66cSDavid du Colombier 6e569ccb5SDavid du Colombier Biobuf bout; 7e569ccb5SDavid du Colombier Fsck fsck; 85e96a66cSDavid du Colombier 9e569ccb5SDavid du Colombier static void 10e569ccb5SDavid du Colombier usage(void) 11e569ccb5SDavid du Colombier { 12e569ccb5SDavid du Colombier fprint(2, "usage: %s [-c cachesize] [-h host] file\n", argv0); 13e569ccb5SDavid du Colombier exits("usage"); 14e569ccb5SDavid du Colombier } 155e96a66cSDavid du Colombier 16*0c6300e7SDavid du Colombier #pragma varargck argpos flprint 1 17*0c6300e7SDavid du Colombier 18e569ccb5SDavid du Colombier static int 19e569ccb5SDavid du Colombier flprint(char *fmt, ...) 20e569ccb5SDavid du Colombier { 21e569ccb5SDavid du Colombier int n; 22e569ccb5SDavid du Colombier va_list arg; 235e96a66cSDavid du Colombier 24e569ccb5SDavid du Colombier va_start(arg, fmt); 25e569ccb5SDavid du Colombier n = Bvprint(&bout, fmt, arg); 26e569ccb5SDavid du Colombier va_end(arg); 27e569ccb5SDavid du Colombier return n; 28e569ccb5SDavid du Colombier } 295e96a66cSDavid du Colombier 30e569ccb5SDavid du Colombier static void 31e569ccb5SDavid du Colombier flclre(Fsck*, Block *b, int o) 32e569ccb5SDavid du Colombier { 33e569ccb5SDavid du Colombier Bprint(&bout, "# clre 0x%ux %d\n", b->addr, o); 34e569ccb5SDavid du Colombier } 355e96a66cSDavid du Colombier 36e569ccb5SDavid du Colombier static void 37e569ccb5SDavid du Colombier flclrp(Fsck*, Block *b, int o) 38e569ccb5SDavid du Colombier { 39e569ccb5SDavid du Colombier Bprint(&bout, "# clrp 0x%ux %d\n", b->addr, o); 40e569ccb5SDavid du Colombier } 41e569ccb5SDavid du Colombier 42e569ccb5SDavid du Colombier static void 43e569ccb5SDavid du Colombier flclri(Fsck*, char *name, MetaBlock*, int, Block*) 44e569ccb5SDavid du Colombier { 45e569ccb5SDavid du Colombier Bprint(&bout, "# clri %s\n", name); 46e569ccb5SDavid du Colombier } 47e569ccb5SDavid du Colombier 48e569ccb5SDavid du Colombier static void 49e569ccb5SDavid du Colombier flclose(Fsck*, Block *b, u32int epoch) 50e569ccb5SDavid du Colombier { 51e569ccb5SDavid du Colombier Bprint(&bout, "# bclose 0x%ux %ud\n", b->addr, epoch); 52e569ccb5SDavid du Colombier } 535e96a66cSDavid du Colombier 545e96a66cSDavid du Colombier void 555e96a66cSDavid du Colombier main(int argc, char *argv[]) 565e96a66cSDavid du Colombier { 575e96a66cSDavid du Colombier int csize = 1000; 585e96a66cSDavid du Colombier VtSession *z; 595e96a66cSDavid du Colombier char *host = nil; 605e96a66cSDavid du Colombier 61e569ccb5SDavid du Colombier fsck.useventi = 1; 62e569ccb5SDavid du Colombier Binit(&bout, 1, OWRITE); 635e96a66cSDavid du Colombier ARGBEGIN{ 645e96a66cSDavid du Colombier default: 655e96a66cSDavid du Colombier usage(); 665e96a66cSDavid du Colombier case 'c': 675e96a66cSDavid du Colombier csize = atoi(ARGF()); 686042bf6dSDavid du Colombier if(csize <= 0) 696042bf6dSDavid du Colombier usage(); 705e96a66cSDavid du Colombier break; 715e96a66cSDavid du Colombier case 'f': 72e569ccb5SDavid du Colombier fsck.useventi = 0; 735e96a66cSDavid du Colombier break; 745e96a66cSDavid du Colombier case 'h': 755e96a66cSDavid du Colombier host = ARGF(); 765e96a66cSDavid du Colombier break; 77e569ccb5SDavid du Colombier case 'v': 78e569ccb5SDavid du Colombier fsck.printdirs = 1; 79e569ccb5SDavid du Colombier break; 805e96a66cSDavid du Colombier }ARGEND; 815e96a66cSDavid du Colombier 825e96a66cSDavid du Colombier if(argc != 1) 835e96a66cSDavid du Colombier usage(); 845e96a66cSDavid du Colombier 855e96a66cSDavid du Colombier vtAttach(); 865e96a66cSDavid du Colombier 875e96a66cSDavid du Colombier fmtinstall('L', labelFmt); 885e96a66cSDavid du Colombier fmtinstall('V', scoreFmt); 895e96a66cSDavid du Colombier fmtinstall('R', vtErrFmt); 905e96a66cSDavid du Colombier 915e96a66cSDavid du Colombier /* 925e96a66cSDavid du Colombier * Connect to Venti. 935e96a66cSDavid du Colombier */ 945e96a66cSDavid du Colombier z = vtDial(host, 0); 957abd426fSDavid du Colombier if(z == nil){ 96e569ccb5SDavid du Colombier if(fsck.useventi) 975e96a66cSDavid du Colombier vtFatal("could not connect to server: %s", vtGetError()); 987abd426fSDavid du Colombier }else if(!vtConnect(z, 0)) 995e96a66cSDavid du Colombier vtFatal("vtConnect: %s", vtGetError()); 1005e96a66cSDavid du Colombier 1015e96a66cSDavid du Colombier /* 1025e96a66cSDavid du Colombier * Initialize file system. 1035e96a66cSDavid du Colombier */ 104e569ccb5SDavid du Colombier fsck.fs = fsOpen(argv[0], z, csize, OReadOnly); 105e569ccb5SDavid du Colombier if(fsck.fs == nil) 1065e96a66cSDavid du Colombier vtFatal("could not open file system: %R"); 1075e96a66cSDavid du Colombier 108e569ccb5SDavid du Colombier fsck.print = flprint; 109e569ccb5SDavid du Colombier fsck.clre = flclre; 110e569ccb5SDavid du Colombier fsck.clrp = flclrp; 111e569ccb5SDavid du Colombier fsck.close = flclose; 112e569ccb5SDavid du Colombier fsck.clri = flclri; 1135e96a66cSDavid du Colombier 114e569ccb5SDavid du Colombier fsCheck(&fsck); 1155e96a66cSDavid du Colombier 1165e96a66cSDavid du Colombier exits(0); 1175e96a66cSDavid du Colombier } 1185e96a66cSDavid du Colombier 119