libeech

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

commit e225e5d0cb91814ee69fa1ca0ed2d912791719fd
parent 92e07b92638cf8d3884da8aa60724057e2a6545f
Author: z3bra <contactatz3bradotorg>
Date:   Sat Jun 30 01:28:22 +0200

Add pwprq() for requesting pieces

Diffstat:
libeech.c | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
libeech.h | 1+
2 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/libeech.c b/libeech.c @@ -67,6 +67,7 @@ static int pwphsck(struct torrent *, char *, long); static ssize_t pwpbf(struct torrent *, struct peer *); static ssize_t pwpchst(struct peer *, int); +static ssize_t pwprq(struct torrent *, struct peer *); static int pwptx(struct torrent *, struct peer *); static int pwprx(struct torrent *, struct peer *); @@ -290,6 +291,7 @@ addpeer(struct peer *pl, char *host, int port) p->next = pl; p->port = port; p->rxbufsz = 0; + p->piece.n = -1; memcpy(p->host, host, HOST_NAME_MAX); memset(p->bf, 0, PCENUM / 8); memset(p->rxbuf, 0, MSGSIZ); @@ -447,6 +449,65 @@ pwpchst(struct peer *p, int t) return send(p->fd, m, 5, MSG_NOSIGNAL); } +static ssize_t +pwprq(struct torrent *t, struct peer *p) +{ + int i; + char m[MSGSIZ]; + ssize_t bl, off = 0; + + /* Find a missing piece we can get from the peer */ + for (i = 0; i >= t->npiece || (!bit(t->bf, i) && bit(p->bf, i)); i++); + + p->piece.n = i; + p->piece.sz = (i == t->npiece - 1) ? t->sz % t->psz : t->psz; + + printf("Requesting piece of size %ld\n", p->piece.sz); + + i = 0; + while (i < p->piece.sz) { + bl = BLKSIZ; + if (i + BLKSIZ > p->piece.sz) + bl = p->piece.sz - i; + + memset(m, 0, MSGSIZ); + off = 0; + /* Message length */ + m[off++] = (13 >> 24) & 0xff; + m[off++] = (13 >> 16) & 0xff; + m[off++] = (13 >> 8) & 0xff; + m[off++] = (13 >> 0) & 0xff; + + /* Message type */ + m[off++] = REQUEST; + + /* Piece index */ + m[off++] = (p->piece.n >> 24) & 0xff; + m[off++] = (p->piece.n >> 16) & 0xff; + m[off++] = (p->piece.n >> 8) & 0xff; + m[off++] = (p->piece.n >> 0) & 0xff; + + /* Block offset */ + m[off++] = (i >> 24) & 0xff; + m[off++] = (i >> 16) & 0xff; + m[off++] = (i >> 8) & 0xff; + m[off++] = (i >> 0) & 0xff; + + /* Block length */ + m[off++] = (bl >> 24) & 0xff; + m[off++] = (bl >> 16) & 0xff; + m[off++] = (bl >> 8) & 0xff; + m[off++] = (bl >> 0) & 0xff; + + send(p->fd, m, 17, MSG_NOSIGNAL); + printf("REQUEST #%ld: %ld/%ld\n", p->piece.n, i + bl, p->piece.sz); + + i += bl; + } + + return 0; +} + static int pwptx(struct torrent *t, struct peer *p) { @@ -462,6 +523,9 @@ pwptx(struct torrent *t, struct peer *p) p->state |= AMINTERESTED; } + if ((p->state & LEECHING) && !(p->state & AMCHOKING) && p->piece.n < 0) + pwprq(t, p); + return 0; } diff --git a/libeech.h b/libeech.h @@ -25,6 +25,7 @@ struct piece { ssize_t sz; char blks[PCESIZ]; char bf[PCESIZ / BLKSIZ]; + char rq[PCESIZ / BLKSIZ]; }; struct peer {