ref: c360a081b34498e8ec80f7325d7ffd3d73ec8275
parent: 893930a6aa9a6436dc792d3f9589f1869455f44e
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon Apr 16 09:29:41 EDT 2012
ip/torrent: more cleanup, error handling for webseed
--- a/sys/src/cmd/ip/torrent.c
+++ b/sys/src/cmd/ip/torrent.c
@@ -655,9 +655,9 @@
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 @@
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 @@
goto Retry;
}
- off = 0;
err = 0;
- while(off < f->len){- if(finished())
+ 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;
- n = MAXIO;
- if((f->len - off) < n)
- n = (f->len - off);
- if((n = read(fd, buf, n)) <= 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);
}
--
⑨