diff options
Diffstat (limited to 'src/cmd/vac/vactest.c')
-rw-r--r-- | src/cmd/vac/vactest.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/cmd/vac/vactest.c b/src/cmd/vac/vactest.c new file mode 100644 index 00000000..c456604f --- /dev/null +++ b/src/cmd/vac/vactest.c @@ -0,0 +1,182 @@ +#include "stdinc.h" +#include "vac.h" +#include "dat.h" +#include "fns.h" + +void usage(void); +int unvac(VacFS *fs); +int readScore(int fd, uchar score[VtScoreSize]); +static void warn(char *fmt, ...); +void dirlist(VacFS *fs, char *path); + +static int nwant; +static char **want; +static int dflag = 1; +static int cflag; +static int lower; +static int verbose; +static int settimes; + +void +main(int argc, char *argv[]) +{ + char *zfile; + int ok, table; + VtSession *z; + char *vsrv = nil; + char *host = nil; + char *p; + int ncache = 1000; + VacFS *fs; + + table = 0; + zfile = nil; + ARGBEGIN{ + case 'D': + dflag++; + break; + case 'c': + cflag++; + break; + case 'C': + p = ARGF(); + if(p == nil) + usage(); + ncache = atoi(p); + if(ncache < 10) + ncache = 10; + if(ncache > 1000000) + ncache = 1000000; + break; + case 'i': + lower++; + break; + case 'f': + zfile = ARGF(); + if(zfile == nil) + usage(); + break; + case 'h': + host = ARGF(); + break; + case 't': + table++; + break; + case 'T': + settimes++; + break; + case 's': + vsrv = ARGF(); + break; + case 'v': + verbose++; + break; + default: + usage(); + break; + }ARGEND + + nwant = argc; + want = argv; + + vtAttach(); + + if(zfile == nil) + usage(); + + if(vsrv != nil) + z = vtStdioServer(vsrv); + else + z = vtDial(host); + if(z == nil) + vtFatal("could not connect to server: %s", vtGetError()); + vtSetDebug(z, 0); + if(!vtConnect(z, 0)) + vtFatal("vtConnect: %s", vtGetError()); + fs = vfsOpen(z, zfile, 1, ncache); + if(fs == nil) + vtFatal("vfsOpen: %s", vtGetError()); + ok = unvac(fs); + vtClose(z); + vtDetach(); + + exits(ok? 0 : "error"); +} + +void +usage(void) +{ + fprint(2, "usage: %s [-tTcDv] -f zipfile [-s ventid] [-h host] [file ...]\n", argv0); + exits("usage"); +} + +void +suck(VacFile *f) +{ + USED(f); +} + + +void +vacfile(VacFS *fs, char *path, VacDir *vd) +{ + char *path2; + + path2 = vtMemAlloc(strlen(path) + 1 + strlen(vd->elem) + 1); + if(path[1] == 0) + sprintf(path2, "/%s", vd->elem); + else + sprintf(path2, "%s/%s", path, vd->elem); +fprint(2, "vac file: %s\n", path2); + if(vd->mode & ModeDir) + dirlist(fs, path2); + vtMemFree(path2); +} + +void +dirlist(VacFS *fs, char *path) +{ + VacDir vd[50]; + VacDirEnum *ds; + int i, n; + + ds = vdeOpen(fs, path); + if(ds == nil) { + fprint(2, "could not open: %s: %s\n", path, vtGetError()); + return; + } + for(;;) { + n = vdeRead(ds, vd, sizeof(vd)/sizeof(VacDir)); + if(n < 0) { + warn("vdRead failed: %s: %s", path, vtGetError()); + return; + } + if(n == 0) + break; + for(i=0; i<n; i++) { + vacfile(fs, path, &vd[i]); + vdCleanup(&vd[i]); + } + } + vdeFree(ds); +} + +int +unvac(VacFS *fs) +{ + dirlist(fs, "/"); + + return 1; +} + +static void +warn(char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + fprint(2, "%s: ", argv0); + vfprint(2, fmt, arg); + fprint(2, "\n"); + va_end(arg); +} |