diff options
author | David du Colombier <0intro@gmail.com> | 2013-09-23 23:00:39 +0200 |
---|---|---|
committer | David du Colombier <0intro@gmail.com> | 2013-09-23 23:00:39 +0200 |
commit | 6f4d00ee45693290fae042b27536b54f77b96acd (patch) | |
tree | 60ad31bf16ed2000661c02345dd2a63851588a5d /src/cmd/fossil/flchk.c | |
parent | fea86f063930ea187f1c77e93207ac8d39125520 (diff) | |
download | plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.tar.gz plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.tar.bz2 plan9port-6f4d00ee45693290fae042b27536b54f77b96acd.zip |
fossil: import from plan 9
R=rsc
https://codereview.appspot.com/7988047
Diffstat (limited to 'src/cmd/fossil/flchk.c')
-rw-r--r-- | src/cmd/fossil/flchk.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/cmd/fossil/flchk.c b/src/cmd/fossil/flchk.c new file mode 100644 index 00000000..b19fd5be --- /dev/null +++ b/src/cmd/fossil/flchk.c @@ -0,0 +1,118 @@ +#include "stdinc.h" +#include <bio.h> +#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); +} + |