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