summaryrefslogtreecommitdiff
path: root/src/peer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/peer.c')
-rw-r--r--src/peer.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/peer.c b/src/peer.c
index f719622..f984aec 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -61,7 +61,7 @@ static bool peer_in_ready(peer *p)
if (p->in.len == p->in.promised && p->in.len != 0) {
if (!p->in.header)
return true;
-
+
size_t len = *(pkt_header *) p->in.buffer;
if (len > PEER_INBUFFER_SIZE)
// TODO: figure out what to do if packet too large (disconnect?)
@@ -75,7 +75,7 @@ static bool peer_in_ready(peer *p)
// out
-static void send_raw(peer *p, uint8_t *data, size_t len)
+static void send_raw(peer *p, void *data, size_t len)
{
memcpy(p->out.buffer + p->out.cursor + p->out.avail, data, len);
p->out.avail += len;
@@ -94,7 +94,7 @@ static bool out_space(peer *p, size_t len)
return true;
}
-bool peer_send(peer *p, uint8_t *data, size_t len)
+bool peer_send(peer *p, void *data, size_t len)
{
if (len > PEER_INBUFFER_SIZE)
return false;
@@ -104,7 +104,7 @@ bool peer_send(peer *p, uint8_t *data, size_t len)
if (!out_space(p, sizeof hdr + len))
return false;
- send_raw(p, (uint8_t *) &hdr, sizeof hdr);
+ send_raw(p, &hdr, sizeof hdr);
send_raw(p, data, len);
return true;
@@ -135,21 +135,29 @@ static bool peer_out_ready(peer *p)
// poll
-short peer_prepare(peer *p)
+struct pollfd peer_prepare(peer *p)
{
+ struct pollfd pfd = {0};
+
+ pfd.fd = p->socket;
if (p->in.len == p->in.promised)
next_in(p, true, sizeof(pkt_header));
- return POLLIN | (p->out.avail ? POLLOUT : 0);
+ pfd.events = POLLIN | (p->out.avail ? POLLOUT : 0);
+
+ return pfd;
}
-bool peer_ready(peer *p, short revents)
+bool peer_ready(peer *p, struct pollfd pfd)
{
bool x = false;
- if (revents & POLLIN)
+ if (pfd.revents & (POLLHUP | POLLERR))
+ p->disco = true;
+
+ if (pfd.revents & POLLIN)
x = x || peer_in_ready(p);
- if (revents & POLLOUT)
+ if (pfd.revents & POLLOUT)
x = x || peer_out_ready(p);
return x;