diff options
author | defanor <defanor@uberspace.net> | 2020-02-29 23:48:05 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-02-29 23:48:05 +0300 |
commit | 9f644b825cc6d0feb68ddd4bc971b8b32d7ec6b5 (patch) | |
tree | 9d167b2e58119c831f95966490708a1937efc3f7 | |
parent | 60f39a3ae315cef94b47a18a9a51ba549051389c (diff) |
Add rexmpp_tcp_connected
-rw-r--r-- | src/rexmpp_tcp.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/src/rexmpp_tcp.c b/src/rexmpp_tcp.c index 55e6c1b..777aa37 100644 --- a/src/rexmpp_tcp.c +++ b/src/rexmpp_tcp.c @@ -66,6 +66,31 @@ void rexmpp_dns_a_cb (void *ptr, } rexmpp_tcp_conn_error_t +rexmpp_tcp_connected (rexmpp_tcp_conn_t *conn, int fd) { + 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->addr_v4 != NULL) { + ares_free_hostent(conn->addr_v4); + conn->addr_v4 = NULL; + } + if (conn->addr_v6 != NULL) { + ares_free_hostent(conn->addr_v6); + conn->addr_v6 = NULL; + } + + return REXMPP_CONN_DONE; +} + +rexmpp_tcp_conn_error_t rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, const char *host, int port) @@ -105,7 +130,8 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, return REXMPP_CONN_ERROR; } } else { - return REXMPP_CONN_DONE; + return rexmpp_tcp_connected(conn, + conn->sockets[conn->connection_attempts]); } conn->connection_attempts++; return REXMPP_CONN_IN_PROGRESS; @@ -125,7 +151,8 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, return REXMPP_CONN_ERROR; } } else { - return REXMPP_CONN_DONE; + return rexmpp_tcp_connected(conn, + conn->sockets[conn->connection_attempts]); } conn->connection_attempts++; return REXMPP_CONN_IN_PROGRESS; @@ -143,22 +170,6 @@ rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn, } int rexmpp_tcp_conn_finish (rexmpp_tcp_conn_t *conn) { - int i; - 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->addr_v4 != NULL) { - ares_free_hostent(conn->addr_v4); - conn->addr_v4 = NULL; - } - if (conn->addr_v6 != NULL) { - ares_free_hostent(conn->addr_v6); - conn->addr_v6 = NULL; - } return conn->fd; } @@ -191,8 +202,7 @@ rexmpp_tcp_conn_proceed (rexmpp_tcp_conn_t *conn, return REXMPP_CONN_ERROR; } else { if (err == 0) { - conn->fd = conn->sockets[i]; - return REXMPP_CONN_DONE; + return rexmpp_tcp_connected(conn, conn->sockets[i]); } else if (err != EINPROGRESS) { close(conn->sockets[i]); conn->sockets[i] = -1; @@ -280,8 +290,8 @@ rexmpp_tcp_conn_proceed (rexmpp_tcp_conn_t *conn, } } } else { - conn->fd = conn->sockets[conn->connection_attempts]; - return REXMPP_CONN_DONE; + return rexmpp_tcp_connected(conn, + conn->sockets[conn->connection_attempts]); } } } |