#include "deluge.h" int mainstacksize = STACKSIZE; Torrent *torrent; int list; int debug = 1; int verify; int verbose = 1; void usage(void) { fprint(2, "usage: deluge [-d level] [-v] [-l | -V] torrentfile\n"); threadexitsall("usage"); } void threadmain(int argc, char *argv[]) { char *errmsg; Biobuf *bp; char *file; Bee torb; Torrent t; File *f; int i; vlong fstored; ARGBEGIN{ case 'd': debug = atoi(EARGF(usage())); break; case 'l': list = 1; break; case 'v': verbose = 1; break; case 'V': verify = 1; break; default: usage(); }ARGEND; if(argc != 1 || list && verify) usage(); fmtinstall('H', Hfmt); fmtinstall('L', Lfmt); fmtinstall('M', Mfmt); fmtinstall('B', Bfmt); fmtinstall('P', Pfmt); fmtinstall('C', Cfmt); fmtinstall('I', Ifmt); fmtinstall('F', Ffmt); fmtinstall('R', Rfmt); fmtinstall('T', Tfmt); file = argv[0]; bp = Bopen(file, OREAD); if(bp == nil) sysfatal("open %s: %r", file); errmsg = beeunpickle(bp, &torb); if(errmsg) sysfatal("parsing %s: %s", file, errmsg); if(debug) beeprint(2, 0, &torb); Bterm(bp); if(verify){ torrentinit(&t, &torb, 1, 0); print("verifying %L in %d pieces...\n", t.length, t.npieces); torrentverify(&t); print("total number of bytes: %lld\n", t.length); print("total number of verified bytes: %lld\n", t.stored); print("verified %L out of %L (%3d%%), %d/%d pieces\n", t.stored, t.length, (int)(100.0*t.stored/t.length), bitnhave(t.haves), t.npieces); print("total of %d files:\n", filelen(t.files)); for(f = t.files; f; f = f->next){ fstored = 0; for(i = f->offset/t.piecelen; i < (f->offset+f->length+t.piecelen-1)/t.piecelen; i++) if(bitget(t.haves, i)) fstored += filebytesinpiece(&t, f, &t.pieces[i]); print("\t%3d%%\t%s (%L/%L)\n", (int)(100.0*fstored/f->length), f->path, fstored, f->length); } threadexitsall(0); } if(list){ torrentinit(&t, &torb, 0, 0); print("infohash: %H\n", t.infohash); print("total length: %L (%lld bytes)\n", t.length, t.length); print("piece length: %L (%lud bytes)\n", (vlong)t.piecelen, t.piecelen); print("number of pieces: %d\n", t.npieces); print("announce url: %s\n", t.announce); print("files\n"); for(f = t.files; f; f = f->next) print("\t%6L\t%s (%lld bytes)\n", f->length, f->path, f->length); threadexitsall(0); } torrentinit(&t, &torb, 1, 1); if(!t.filecreated) torrentverify(&t); torrentprep(&t); torrentdo(&t); threadexitsall(0); }