X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=utcp.c;h=5dc7501a20d805e0d57520196bae31ec41657e78;hb=275129c9d08b2d29529b2f9d039198168aeb52a7;hp=5938ea5bcea6af1a99b9d2e885b8fd68bdf70435;hpb=3bc564058072a79a22320f8c5bc50e8844896114;p=utcp diff --git a/utcp.c b/utcp.c index 5938ea5..5dc7501 100644 --- a/utcp.c +++ b/utcp.c @@ -453,7 +453,7 @@ struct utcp_connection *utcp_connect_ex(struct utcp *utcp, uint16_t dst, utcp_re return NULL; } - assert((flags & ~0xf) == 0); + assert((flags & ~0x1f) == 0); c->flags = flags; c->recv = recv; @@ -1195,6 +1195,10 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + return 0; case SYN_RECEIVED: @@ -1222,6 +1226,10 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + return 0; case CLOSING: @@ -1506,7 +1514,7 @@ skip_ack: c->rcv.nxt++; len++; - // Inform the application that the peer closed the connection. + // Inform the application that the peer closed its end of the connection. if(c->recv) { errno = 0; c->recv(c, NULL, 0); @@ -1685,6 +1693,7 @@ void utcp_abort_all_connections(struct utcp *utcp) { } utcp_recv_t old_recv = c->recv; + utcp_poll_t old_poll = c->poll; reset_connection(c); @@ -1692,6 +1701,11 @@ void utcp_abort_all_connections(struct utcp *utcp) { errno = 0; old_recv(c, NULL, 0); } + + if(old_poll && !c->reapable) { + errno = 0; + old_poll(c, 0); + } } return; @@ -1754,7 +1768,7 @@ struct timeval utcp_timeout(struct utcp *utcp) { c->recv(c, NULL, 0); } - if(c->poll) { + if(c->poll && !c->reapable) { c->poll(c, 0); } @@ -1838,11 +1852,16 @@ void utcp_exit(struct utcp *utcp) { for(int i = 0; i < utcp->nconnections; i++) { struct utcp_connection *c = utcp->connections[i]; - if(!c->reapable) + if(!c->reapable) { if(c->recv) { c->recv(c, NULL, 0); } + if(c->poll && !c->reapable) { + c->poll(c, 0); + } + } + buffer_exit(&c->rcvbuf); buffer_exit(&c->sndbuf); free(c);