libeech

BitTorrent library
git clone git://z3bra.org/libeech.git
Log | Files | Refs | README | LICENSE

commit 4d2331780189dff51f9159dbaab0b972efd9b237
parent a9cf1902aadd303a909d2f09d434b4d936b8cc90
Author: z3bra <contactatz3bradotorg>
Date:   Wed Jul  4 08:52:10 +0200

Read piece from metafile (./<HASH>) instead of files

Diffstat:
libeech.c | 37+++++++++----------------------------
1 file changed, 9 insertions(+), 28 deletions(-)
diff --git a/libeech.c b/libeech.c @@ -245,10 +245,9 @@ chktorrent(struct be *b) static long readpiece(struct torrent *t, struct piece *p, long n) { - int i; - size_t off, fp; - ssize_t sz; - FILE *fh = NULL; + char hex[41]; + size_t off; + FILE *f = NULL; /* last piece might be truncated, so recalculate it*/ p->sz = (n == t->npiece - 1) ? t->sz % t->psz : t->psz; @@ -256,31 +255,13 @@ readpiece(struct torrent *t, struct piece *p, long n) /* Calculate file offset for this piece */ off = t->psz * n; - /* find file whose piece's offset belongs to */ - fp = i = 0; - while (fp + t->files[i].sz < off && i < t->nfile) - fp += t->files[i++].sz; - - sz = 0; - while (sz < p->sz) { - /* Keep up reading data from next files if needed*/ - if (off + sz >= t->files[i].sz) { - i++; - if (i >= t->nfile) - return -1; - fp += t->files[i].sz; - } - - fh = fopen(t->files[i].path, "r"); - if (!fh) - return -1; - - if (off + sz - fp) - fseek(fh, off + sz - fp, SEEK_SET); + f = fopen(tohex(t->ih, hex, 20), "r"); + if (!f) + return -1; - sz += fread(p->blks, 1, p->sz - sz, fh); - fclose(fh); - } + fseek(f, off, SEEK_SET); + fread(p->blks, 1, p->sz, f); + fclose(f); return p->sz; }