ip/torrent: more cleanup, error handling for webseed

This commit is contained in:
cinap_lenrek 2012-04-16 13:29:41 +02:00
parent bb58166162
commit 95d7fa1c0e

View file

@ -655,9 +655,9 @@ hopen(char *url, ...)
void void
webseed(Dict *w, File *f) webseed(Dict *w, File *f)
{ {
vlong off, woff; int fd, err, n, m, o, p, x, y;
int fd, n, m, r, p, x, y, err;
uchar buf[MAXIO]; uchar buf[MAXIO];
vlong off, len;
Dict *w0; Dict *w0;
char *s; char *s;
@ -674,6 +674,7 @@ Retry:
else else
fd = hopen("%s", w->str); fd = hopen("%s", w->str);
if(fd < 0){ if(fd < 0){
Error:
if(debug) fprint(2, "webseed %s %s: %r\n", w->str, f->name); if(debug) fprint(2, "webseed %s %s: %r\n", w->str, f->name);
if(finished()) if(finished())
exits(0); exits(0);
@ -682,45 +683,45 @@ Retry:
goto Retry; goto Retry;
} }
off = 0;
err = 0; err = 0;
while(off < f->len){ off = f->off;
if(finished()) len = f->len;
while(len > 0 && !finished()){
m = sizeof(buf);
if(len < m)
m = len;
if((n = read(fd, buf, m)) <= 0)
break; break;
n = MAXIO;
if((f->len - off) < n) x = off / blocksize;
n = (f->len - off); p = off - (vlong)x*blocksize;
if((n = read(fd, buf, n)) <= 0)
break;
woff = f->off + off;
x = woff / blocksize;
off += n; off += n;
y = (f->off + off) / blocksize; len -= n;
p = woff - x*blocksize; y = off / blocksize;
m = 0;
while(m < n){ o = 0;
r = pieces[x].len - p; while(n > 0){
if(r > (n-m)) m = pieces[x].len - p;
r = n-m; if(m > n)
m = n;
if((havemap[x>>3] & (0x80>>(x&7))) == 0) if((havemap[x>>3] & (0x80>>(x&7))) == 0)
if(rwpiece(1, x, buf+m, r, p) != r) rwpiece(1, x, buf+o, m, p);
goto Err;
if(x == y) if(x == y)
break; break;
m += r; o += m;
n -= m;
p = 0; p = 0;
if(havepiece(x++)) if(havepiece(x++))
continue; continue;
if(++err > 10){ if(++err > 10){
fprint(2, "webseed %s %s: corrupt\n", w->str, f->name); close(fd);
goto Err; werrstr("file corrupted");
goto Error;
} }
} }
} }
havepiece(off / blocksize);
havepiece(f->off / blocksize); havepiece(f->off / blocksize);
havepiece((f->off+f->len) / blocksize);
Err:
close(fd); close(fd);
exits(0); exits(0);
} }