libeech

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

commit 84c079251a69ad84d676a2b0db32a8b3f8ca96c7
parent ddf51c1ca8e2c0f84e146cf52d019a599b5c45c2
Author: z3bra <contactatz3bradotorg>
Date:   Tue Feb 13 23:21:28 -0500

Factorize transmitting/receiving messages

Diffstat:
libeech.c | 46+++++++++++++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/libeech.c b/libeech.c @@ -44,6 +44,9 @@ static ssize_t pwphs(struct torrent *, struct peer *); static ssize_t pwphsrecv(struct peer *); static int pwphsck(struct torrent *, char *, long); +static int pwptx(struct torrent *, struct peer *); +static int pwprx(struct torrent *, struct peer *); + /* p2p network management */ static int netconn(char *, int); static int netloop(struct torrent *, int); @@ -335,6 +338,30 @@ pwphsck(struct torrent *t, char *hs, long l) } static int +pwptx(struct torrent *t, struct peer *p) +{ + /* send handshake */ + if (!(p->state & HANDSHAKESENT)) { + pwphs(t, p); + p->state |= HANDSHAKESENT; + } + return 0; +} + +static int +pwprx(struct torrent *t, struct peer *p) +{ + /* receive and verify handshake */ + if (!(p->state & HANDSHAKERCVD)) { + pwphsrecv(p); + if (p->buflen >= 68 && pwphsck(t, p->buf, p->buflen)) + delpeer(t->peers, p); + p->state |= HANDSHAKERCVD; + } + return 0; +} + +static int netconn(char *host, int port) { int fd = -1; @@ -395,22 +422,11 @@ netloop(struct torrent *t, int timeout) return r; for (i = 0; i < nfds; i++) { - //printf("fd:%d ev:%d\n", pfds.p[i]->fd, pfds.fds[i].revents); - if (pfds.fds[i].revents & POLLOUT) { - /* send handshake */ - if (!(pfds.p[i]->state & HANDSHAKESENT)) { - pwphs(t, pfds.p[i]); - pfds.p[i]->state |= HANDSHAKESENT; - } - } + if (pfds.fds[i].revents & POLLOUT) + pwptx(t, pfds.p[i]); - if (pfds.fds[i].revents & POLLIN) { - /* receive and verify handshake */ - if (!(pfds.p[i]->state & HANDSHAKERCVD)) { - if (pwphsrecv(pfds.p[i]) >= 68 && !pwphsck(t, pfds.p[i]->buf, pfds.p[i]->buflen)) - pfds.p[i]->state |= HANDSHAKERCVD; - } - } + if (pfds.fds[i].revents & POLLIN) + pwprx(t, pfds.p[i]); /* peer is now ready to exchange data */ if (pfds.p[i]->state & HANDSHAKESENT && pfds.p[i]->state & HANDSHAKERCVD)