ip/torrent: more cleanup, error handling for webseed
This commit is contained in:
parent
bb58166162
commit
95d7fa1c0e
1 changed files with 28 additions and 27 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue