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