summaryrefslogtreecommitdiffstats
path: root/PICA_client.c
diff options
context:
space:
mode:
authorAnton <anton@picapica>2016-10-21 16:35:50 +0400
committerAnton <anton@picapica>2016-10-21 16:35:50 +0400
commitabbfa4ccdcfc8633e5b30064f66af40b6b17cbd6 (patch)
tree8ea8a2b02c4c6f9b3145aef19750e382b183e0f3 /PICA_client.c
parent9164d6c7266f2ea66459d1971128ca6071e6a4a2 (diff)
downloadpica-pica-abbfa4ccdcfc8633e5b30064f66af40b6b17cbd6.tar.gz
pica-pica-abbfa4ccdcfc8633e5b30064f66af40b6b17cbd6.zip
implemented closing listener connections
Diffstat (limited to 'PICA_client.c')
-rw-r--r--PICA_client.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/PICA_client.c b/PICA_client.c
index 4f218c3..85469c9 100644
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -1972,11 +1972,18 @@ static int process_listener(struct PICA_listener *lst, fd_set *rfds, fd_set *wfd
while(conn)
{
+ struct PICA_listener_conn *kill_ptr = NULL;
+
if (process_listener_conn(conn, rfds, wfds) != PICA_OK)
{
- --- close listener conn
+ kill_ptr = conn;
}
conn = conn->next;
+
+ if (kill_ptr)
+ {
+ listener_close_conn(kill_ptr);
+ }
}
return PICA_OK;
@@ -2738,13 +2745,29 @@ void PICA_close_acc(struct PICA_acc *a)
free(a);
}
+void listener_close_conn(struct PICA_listener_conn *c)
+{
+ SSL_free(c->ssl);
+ SHUTDOWN(c->sck);
+ CLOSE(c->sck);
+
+ X509_free(c->peer_cert);
+ free(c);
+}
+
void PICA_close_listener(struct PICA_listener *l)
{
CLOSE(l->sck_listener);
free(l->public_addr_dns);
- free(l);
- -- close accepted connections
+ while(l->accepted_connections)
+ {
+ struct PICA_listener_conn *c = l->accepted_connections;
+ l->accepted_connections = c->next;
+ listener_close_conn(c);
+ }
+
+ free(l);
}
#ifdef WIN32