From 077c2b2f53aaa905822f122d48aca8a1c72f2f1d Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Wed, 27 May 2009 20:33:14 +0200 Subject: [PATCH] Correct handling of closed TCP connections in proto_inet In FRSH_FORB this allows restarting resource managers without restart of fcb. The problem of previous implementation was, that if the socket was closed but peer structure was not unregistered the disconnected peer structure stored fd of closed socket and when a new connection was made, the fd was the same as stored in disconnected peer structure. Therefore the disconnected peer appeared as alive. --- src/proto_inet.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/proto_inet.c b/src/proto_inet.c index a77da0c..1da3605 100644 --- a/src/proto_inet.c +++ b/src/proto_inet.c @@ -362,8 +362,13 @@ inet_recv(forb_port_t *port, void *buf, size_t len) port->new_peer = NULL; } ul_logdeb("recv fd=%d disconnect\n", iport->last_recv_fd); - close(iport->last_recv_fd); - /* TODO: Notify FORB about peer disconnect */ + ul_list_for_each(forb_port_peer, port, peer) { + struct inet_peer *ipeer = peer->proto_priv; + if (ipeer && ipeer->socket == iport->last_recv_fd) { + forb_peer_disconnected(peer); + break; + } + } iport->last_recv_fd = -1; continue; } @@ -408,6 +413,7 @@ inet_peer_destroy(forb_peer_t *peer) struct inet_peer *ipeer = peer->proto_priv; if (ipeer) { peer->proto_priv = NULL; + ul_logdeb("destroying peer fd=%d\n", ipeer->socket); close(ipeer->socket); free(ipeer); } -- 2.39.2