diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-04-16 13:29:41 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-04-16 13:29:41 +0200 |
commit | 95d7fa1c0e54aff3d0405909f256c73b21665718 (patch) | |
tree | 290de03bafca093a696591bde4421b31d2889edd | |
parent | bb5816616244a564c978fdb91a1cca4a22425429 (diff) | |
download | plan9front-95d7fa1c0e54aff3d0405909f256c73b21665718.tar.xz |
ip/torrent: more cleanup, error handling for webseed
-rw-r--r-- | sys/src/cmd/ip/torrent.c | 55 |
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); } |