From: Guus Sliepen <guus@meshlink.io>
Date: Tue, 17 Sep 2019 19:45:22 +0000 (+0200)
Subject: Call the poll callback with 0 whenever a connection is closed.
X-Git-Url: http://git.meshlink.io/?a=commitdiff_plain;h=275129c9d08b2d29529b2f9d039198168aeb52a7;p=utcp

Call the poll callback with 0 whenever a connection is closed.
---

diff --git a/utcp.c b/utcp.c
index 3a29947..5dc7501 100644
--- a/utcp.c
+++ b/utcp.c
@@ -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);