xref: /plan9/sys/src/cmd/fossil/flchk.c (revision 0c6300e705c776baceaa75d1b64fc63b9564225a)
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
usage(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
flprint(char * fmt,...)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
flclre(Fsck *,Block * b,int o)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
flclrp(Fsck *,Block * b,int o)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
flclri(Fsck *,char * name,MetaBlock *,int,Block *)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
flclose(Fsck *,Block * b,u32int epoch)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
main(int argc,char * argv[])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