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