summaryrefslogtreecommitdiff
path: root/src/rexmpp_tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rexmpp_tcp.c')
-rw-r--r--src/rexmpp_tcp.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/src/rexmpp_tcp.c b/src/rexmpp_tcp.c
index 27c3ba4..a4d5018 100644
--- a/src/rexmpp_tcp.c
+++ b/src/rexmpp_tcp.c
@@ -6,7 +6,6 @@
@copyright MIT license.
*/
-#include <unbound.h>
#include <netdb.h>
#include <arpa/nameser.h>
#include <sys/socket.h>
@@ -19,17 +18,19 @@
#include <arpa/inet.h>
#include <fcntl.h>
+#include "rexmpp.h"
#include "rexmpp_tcp.h"
+#include "rexmpp_dns.h"
-void rexmpp_dns_aaaa_cb (void *ptr,
- int status,
- struct ub_result *result)
+void rexmpp_tcp_dns_aaaa_cb (rexmpp_t *s,
+ void *ptr,
+ rexmpp_dns_result_t *result)
{
+ (void)s;
rexmpp_tcp_conn_t *conn = ptr;
- conn->resolver_status_v6 = status;
conn->resolved_v6 = result;
- if (status == 0 && ! result->bogus && result->havedata) {
+ if (result != NULL) {
conn->resolution_v6 = REXMPP_CONN_RESOLUTION_SUCCESS;
conn->addr_cur_v6 = -1;
} else {
@@ -37,14 +38,14 @@ void rexmpp_dns_aaaa_cb (void *ptr,
}
}
-void rexmpp_dns_a_cb (void *ptr,
- int status,
- struct ub_result *result)
+void rexmpp_tcp_dns_a_cb (rexmpp_t *s,
+ void *ptr,
+ rexmpp_dns_result_t *result)
{
+ (void)s;
rexmpp_tcp_conn_t *conn = ptr;
- conn->resolver_status_v4 = status;
conn->resolved_v4 = result;
- if (status == 0 && ! result->bogus && result->havedata) {
+ if (result != NULL) {
conn->resolution_v4 = REXMPP_CONN_RESOLUTION_SUCCESS;
conn->addr_cur_v4 = -1;
if (conn->resolution_v6 == REXMPP_CONN_RESOLUTION_WAITING) {
@@ -74,11 +75,11 @@ void rexmpp_tcp_cleanup (rexmpp_tcp_conn_t *conn) {
conn->resolution_v6 = REXMPP_CONN_RESOLUTION_INACTIVE;
}
if (conn->resolved_v4 != NULL) {
- ub_resolve_free(conn->resolved_v4);
+ rexmpp_dns_result_free(conn->resolved_v4);
conn->resolved_v4 = NULL;
}
if (conn->resolved_v6 != NULL) {
- ub_resolve_free(conn->resolved_v6);
+ rexmpp_dns_result_free(conn->resolved_v6);
conn->resolved_v6 = NULL;
}
}
@@ -99,8 +100,8 @@ rexmpp_tcp_connected (rexmpp_tcp_conn_t *conn, int fd) {
}
rexmpp_tcp_conn_error_t
-rexmpp_tcp_conn_init (rexmpp_tcp_conn_t *conn,
- struct ub_ctx *resolver_ctx,
+rexmpp_tcp_conn_init (rexmpp_t *s,
+ rexmpp_tcp_conn_t *conn,
const char *host,
uint16_t port)
{
@@ -165,12 +166,11 @@ 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_ctx = resolver_ctx;
- ub_resolve_async(conn->resolver_ctx, host, 28, 1,
- conn, rexmpp_dns_aaaa_cb, NULL);
- ub_resolve_async(conn->resolver_ctx, host, 1, 1,
- conn, rexmpp_dns_a_cb, NULL);
+ rexmpp_dns_resolve(s, host, 28, 1,
+ conn, rexmpp_tcp_dns_aaaa_cb);
+ rexmpp_dns_resolve(s, host, 1, 1,
+ conn, rexmpp_tcp_dns_a_cb);
return REXMPP_CONN_IN_PROGRESS;
}
@@ -193,7 +193,8 @@ int rexmpp_tcp_conn_ipv6_available(rexmpp_tcp_conn_t *conn) {
}
rexmpp_tcp_conn_error_t
-rexmpp_tcp_conn_proceed (rexmpp_tcp_conn_t *conn,
+rexmpp_tcp_conn_proceed (rexmpp_t *s,
+ rexmpp_tcp_conn_t *conn,
fd_set *read_fds,
fd_set *write_fds)
{
@@ -222,9 +223,7 @@ rexmpp_tcp_conn_proceed (rexmpp_tcp_conn_t *conn,
/* Name resolution. */
if (conn->resolution_v4 == REXMPP_CONN_RESOLUTION_WAITING ||
conn->resolution_v6 == REXMPP_CONN_RESOLUTION_WAITING) {
- if (ub_poll(conn->resolver_ctx)) {
- ub_process(conn->resolver_ctx);
- }
+ rexmpp_dns_process(s, read_fds, write_fds);
}
if (conn->resolution_v4 == REXMPP_CONN_RESOLUTION_FAILURE &&
@@ -344,17 +343,15 @@ rexmpp_tcp_conn_proceed (rexmpp_tcp_conn_t *conn,
}
}
-int rexmpp_tcp_conn_fds (rexmpp_tcp_conn_t *conn,
+int rexmpp_tcp_conn_fds (rexmpp_t *s,
+ rexmpp_tcp_conn_t *conn,
fd_set *read_fds,
fd_set *write_fds)
{
int max_fd = 0, i;
if (conn->resolution_v4 == REXMPP_CONN_RESOLUTION_WAITING ||
conn->resolution_v6 == REXMPP_CONN_RESOLUTION_WAITING) {
- max_fd = ub_fd(conn->resolver_ctx) + 1;
- if (max_fd != 0) {
- FD_SET(max_fd - 1, read_fds);
- }
+ max_fd = rexmpp_dns_fds(s, read_fds, write_fds);
}
for (i = 0; i < REXMPP_TCP_MAX_CONNECTION_ATTEMPTS; i++) {
if (conn->sockets[i] != -1) {
@@ -367,12 +364,17 @@ int rexmpp_tcp_conn_fds (rexmpp_tcp_conn_t *conn,
return max_fd;
}
-struct timeval *rexmpp_tcp_conn_timeout (rexmpp_tcp_conn_t *conn,
+struct timeval *rexmpp_tcp_conn_timeout (rexmpp_t *s,
+ rexmpp_tcp_conn_t *conn,
struct timeval *max_tv,
struct timeval *tv)
{
struct timeval now;
struct timeval *ret = max_tv;
+ if (conn->resolution_v4 == REXMPP_CONN_RESOLUTION_WAITING ||
+ conn->resolution_v6 == REXMPP_CONN_RESOLUTION_WAITING) {
+ ret = rexmpp_dns_timeout(s, max_tv, tv);
+ }
if (conn->resolution_v4 == REXMPP_CONN_RESOLUTION_SUCCESS ||
conn->resolution_v6 == REXMPP_CONN_RESOLUTION_SUCCESS ||
(conn->resolution_v4 == REXMPP_CONN_RESOLUTION_INACTIVE &&