#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