summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-04-16 13:29:41 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-04-16 13:29:41 +0200
commit95d7fa1c0e54aff3d0405909f256c73b21665718 (patch)
tree290de03bafca093a696591bde4421b31d2889edd
parentbb5816616244a564c978fdb91a1cca4a22425429 (diff)
downloadplan9front-95d7fa1c0e54aff3d0405909f256c73b21665718.tar.xz
ip/torrent: more cleanup, error handling for webseed
-rw-r--r--sys/src/cmd/ip/torrent.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/sys/src/cmd/ip/torrent.c b/sys/src/cmd/ip/torrent.c
index 0770ac226..d144387b7 100644
--- a/sys/src/cmd/ip/torrent.c
+++ b/sys/src/cmd/ip/torrent.c
@@ -655,9 +655,9 @@ hopen(char *url, ...)
void
webseed(Dict *w, File *f)
{
- vlong off, woff;
- int fd, n, m, r, p, x, y, err;
+ int fd, err, n, m, o, p, x, y;
uchar buf[MAXIO];
+ vlong off, len;
Dict *w0;
char *s;
@@ -674,6 +674,7 @@ Retry:
else
fd = hopen("%s", w->str);
if(fd < 0){
+Error:
if(debug) fprint(2, "webseed %s %s: %r\n", w->str, f->name);
if(finished())
exits(0);
@@ -682,45 +683,45 @@ Retry:
goto Retry;
}
- off = 0;
err = 0;
- while(off < f->len){
- if(finished())
- break;
- n = MAXIO;
- if((f->len - off) < n)
- n = (f->len - off);
- if((n = read(fd, buf, n)) <= 0)
+ off = f->off;
+ len = f->len;
+ while(len > 0 && !finished()){
+ m = sizeof(buf);
+ if(len < m)
+ m = len;
+ if((n = read(fd, buf, m)) <= 0)
break;
- woff = f->off + off;
- x = woff / blocksize;
+
+ x = off / blocksize;
+ p = off - (vlong)x*blocksize;
off += n;
- y = (f->off + off) / blocksize;
- p = woff - x*blocksize;
- m = 0;
- while(m < n){
- r = pieces[x].len - p;
- if(r > (n-m))
- r = n-m;
+ len -= n;
+ y = off / blocksize;
+
+ o = 0;
+ while(n > 0){
+ m = pieces[x].len - p;
+ if(m > n)
+ m = n;
if((havemap[x>>3] & (0x80>>(x&7))) == 0)
- if(rwpiece(1, x, buf+m, r, p) != r)
- goto Err;
+ rwpiece(1, x, buf+o, m, p);
if(x == y)
break;
- m += r;
+ o += m;
+ n -= m;
p = 0;
if(havepiece(x++))
continue;
if(++err > 10){
- fprint(2, "webseed %s %s: corrupt\n", w->str, f->name);
- goto Err;
+ close(fd);
+ werrstr("file corrupted");
+ goto Error;
}
}
}
-
+ havepiece(off / blocksize);
havepiece(f->off / blocksize);
- havepiece((f->off+f->len) / blocksize);
-Err:
close(fd);
exits(0);
}