Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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);
}