diff options
Diffstat (limited to 'src/peer.c')
-rw-r--r-- | src/peer.c | 26 |
1 files changed, 17 insertions, 9 deletions
@@ -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; |