sock : Add DNS-SRV list sorted by priority and weight, check result connection.
This commit is contained in:
committed by
Dmitry Podgorny
parent
f46cf669a3
commit
171b285cbe
42
src/conn.c
42
src/conn.c
@@ -426,11 +426,11 @@ int xmpp_connect_client(xmpp_conn_t * const conn,
|
||||
xmpp_conn_handler callback,
|
||||
void * const userdata)
|
||||
{
|
||||
char *buf = NULL;
|
||||
resolver_srv_rr_t *srv_rr_list = NULL;
|
||||
char *domain;
|
||||
const char *host;
|
||||
unsigned short port;
|
||||
int found = 0;
|
||||
int found = XMPP_DOMAIN_NOT_FOUND;
|
||||
int rc;
|
||||
|
||||
domain = xmpp_jid_domain(conn->ctx, conn->jid);
|
||||
@@ -440,19 +440,39 @@ int xmpp_connect_client(xmpp_conn_t * const conn,
|
||||
xmpp_debug(conn->ctx, "xmpp", "Connecting via altdomain.");
|
||||
host = altdomain;
|
||||
port = altport ? altport : _conn_default_port(conn, XMPP_CLIENT);
|
||||
found = 1;
|
||||
found = XMPP_DOMAIN_ALTDOMAIN;
|
||||
|
||||
/* SSL tunneled connection on 5223 port is legacy and doesn't
|
||||
* have an SRV record. */
|
||||
} else if (!conn->tls_legacy_ssl) {
|
||||
host = buf = xmpp_alloc(conn->ctx, MAX_DOMAIN_LEN);
|
||||
if (buf != NULL) {
|
||||
found = resolver_srv_lookup("xmpp-client", "tcp", domain,
|
||||
buf, MAX_DOMAIN_LEN, &port);
|
||||
host = xmpp_alloc(conn->ctx, MAX_DOMAIN_LEN);
|
||||
srv_rr_list = xmpp_alloc(conn->ctx, sizeof(resolver_srv_rr_t));
|
||||
if (srv_rr_list != NULL) {
|
||||
srv_rr_list->next = NULL;
|
||||
found = resolver_srv_lookup(conn->ctx, "xmpp-client", "tcp", domain,
|
||||
&srv_rr_list);
|
||||
|
||||
/* Try DNS-SRV list connection*/
|
||||
if (found == XMPP_DOMAIN_FOUND) {
|
||||
resolver_srv_rr_t *srv_rr_p = srv_rr_list;
|
||||
sock_t sock_try;
|
||||
while(srv_rr_p != NULL) {
|
||||
xmpp_debug(conn->ctx, "xmpp", "Try sock_connect %s:%d ",srv_rr_p->target, srv_rr_p->port);
|
||||
sock_try = sock_connect(srv_rr_p->target, srv_rr_p->port);
|
||||
if (sock_try == 0){
|
||||
host = srv_rr_p->target;
|
||||
port = srv_rr_p->port;
|
||||
found = XMPP_DOMAIN_FOUND;
|
||||
break;
|
||||
}
|
||||
srv_rr_p = srv_rr_p->next;
|
||||
found = XMPP_DOMAIN_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (XMPP_DOMAIN_NOT_FOUND == found) {
|
||||
xmpp_debug(conn->ctx, "xmpp", "SRV lookup failed, "
|
||||
"connecting via domain.");
|
||||
host = domain;
|
||||
@@ -462,7 +482,11 @@ int xmpp_connect_client(xmpp_conn_t * const conn,
|
||||
rc = _conn_connect(conn, domain, host, port, XMPP_CLIENT,
|
||||
callback, userdata);
|
||||
xmpp_free(conn->ctx, domain);
|
||||
if (buf) xmpp_free(conn->ctx, buf);
|
||||
while (srv_rr_list!=NULL) {
|
||||
resolver_srv_rr_t *rr_next = srv_rr_list->next;
|
||||
xmpp_free(conn->ctx, srv_rr_list);
|
||||
srv_rr_list = rr_next;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user