diff options
author | defanor <defanor@uberspace.net> | 2020-03-01 00:08:24 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-03-01 00:08:24 +0300 |
commit | 38340aca46a68ab7971cc4dd14b20eac9d4195c3 (patch) | |
tree | 0c36ad26d049bc73af094635f289b35976be19b8 | |
parent | c59170241676d156356ff4f2f04cee89321c65e2 (diff) |
Add rexmpp_tcp_cleanup
-rw-r--r-- | src/rexmpp_tcp.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/rexmpp_tcp.c b/src/rexmpp_tcp.c index ff88121..931ea43 100644 --- a/src/rexmpp_tcp.c +++ b/src/rexmpp_tcp.c @@ -65,19 +65,19 @@ void rexmpp_dns_a_cb (void *ptr, } } -rexmpp_tcp_conn_error_t -rexmpp_tcp_connected (rexmpp_tcp_conn_t *conn, int fd) { +void rexmpp_tcp_cleanup (rexmpp_tcp_conn_t *conn) { int i; - conn->fd = fd; - - /* Close other connections, cleanup. */ for (i = 0; i < REXMPP_TCP_MAX_CONNECTION_ATTEMPTS; i++) { if (conn->sockets[i] != -1 && conn->sockets[i] != conn->fd) { close(conn->sockets[i]); conn->sockets[i] = -1; } } - ares_destroy(conn->resolver_channel); + if (conn->resolution_v4 != REXMPP_CONN_RESOLUTION_INACTIVE) { + ares_destroy(conn->resolver_channel); + conn->resolution_v4 = REXMPP_CONN_RESOLUTION_INACTIVE; + conn->resolution_v6 = REXMPP_CONN_RESOLUTION_INACTIVE; + } if (conn->addr_v4 != NULL) { ares_free_hostent(conn->addr_v4); conn->addr_v4 = NULL; @@ -86,7 +86,12 @@ rexmpp_tcp_connected (rexmpp_tcp_conn_t *conn, int fd) { ares_free_hostent(conn->addr_v6); conn->addr_v6 = NULL; } +} +rexmpp_tcp_conn_error_t +rexmpp_tcp_connected (rexmpp_tcp_conn_t *conn, int fd) { + conn->fd = fd; + rexmpp_tcp_cleanup(conn); return REXMPP_CONN_DONE; } @@ -103,7 +108,6 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, conn->port = port; conn->addr_v4 = NULL; conn->addr_v6 = NULL; - conn->resolver_error = ares_init(&(conn->resolver_channel)); conn->fd = -1; conn->next_connection_time.tv_sec = 0; conn->next_connection_time.tv_usec = 0; @@ -160,6 +164,7 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, conn->resolution_v4 = REXMPP_CONN_RESOLUTION_WAITING; conn->resolution_v6 = REXMPP_CONN_RESOLUTION_WAITING; + conn->resolver_error = ares_init(&(conn->resolver_channel)); ares_query(conn->resolver_channel, host, ns_c_in, ns_t_aaaa, rexmpp_dns_aaaa_cb, conn); @@ -170,6 +175,7 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, } int rexmpp_tcp_conn_finish (rexmpp_tcp_conn_t *conn) { + rexmpp_tcp_cleanup(conn); return conn->fd; } |