Skip to content
Snippets Groups Projects
Commit 7744adc4 authored by Emmanuel Milou's avatar Emmanuel Milou
Browse files

Merge branch 'conference'

parents 54c8da9e 37e8f9f1
No related branches found
No related tags found
No related merge requests found
......@@ -514,6 +514,12 @@ gchar** dbus_get_addressbook_list (void);
void dbus_set_addressbook_list (const gchar** list);
/**
* Query the daemon to return a list of network interface (described as there IP address)
*/
gchar** dbus_get_all_ip_interface(void);
/**
* Encapsulate all the url hook-related configuration
* Get the configuration
......
......@@ -104,7 +104,19 @@ typedef enum pj_dns_srv_option
* this option is not specified, the SRV resolver will query
* the DNS A record for the target instead.
*/
PJ_DNS_SRV_RESOLVE_AAAA = 4
PJ_DNS_SRV_RESOLVE_AAAA = 4,
/**
* Specify if the resolver should fallback to getaddrinfo
* under IPV4 mode if DNS A fails after DNS SRV.
*/
PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4 = 8,
/**
* Specify if the resolver should fallback to getaddrinfo
* under IPV6 mode if DNS A fails after DNS SRV.
*/
PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6 = 16,
} pj_dns_srv_option;
......
......@@ -19,6 +19,7 @@
*/
#include <pjlib-util/srv_resolver.h>
#include <pjlib-util/errno.h>
#include <pj/addr_resolv.h>
#include <pj/array.h>
#include <pj/assert.h>
#include <pj/log.h>
......@@ -583,13 +584,53 @@ static void dns_callback(void *user_data,
} else if (status != PJ_SUCCESS) {
char errmsg[PJ_ERR_MSG_SIZE];
/* Update last error */
query_job->last_error = status;
/* Log error */
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s",
errmsg));
if ((query_job->option &
(PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4 | PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6)))
{
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname,
"DNS A record resolution failed: %s,"
" trying getaddrinfo()",
errmsg));
pj_addrinfo ai;
unsigned count;
int af;
if ((query_job->option & PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6)) {
af = pj_AF_INET6();
} else {
af = pj_AF_INET();
}
count = 1;
status = pj_getaddrinfo(af, &query_job->domain_part, &count, &ai);
if (status != PJ_SUCCESS) {
query_job->last_error = status;
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname, "DNS resolution failed with getaddrinfo(): %s",
errmsg));
} else {
if (srv->addr_cnt < ADDR_MAX_COUNT) {
srv->addr[srv->addr_cnt++].s_addr = ai.ai_addr.ipv4.sin_addr.s_addr;
}
PJ_LOG(5,(query_job->objname,
"DNS getaddrinfo() for %.*s: %s",
(int)srv->target_name.slen,
srv->target_name.ptr,
pj_inet_ntoa(srv->addr[srv->addr_cnt])));
}
} else {
/* Update last error */
query_job->last_error = status;
/* Log error */
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s",
errmsg));
}
}
++query_job->host_resolved;
......
......@@ -361,14 +361,21 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
if (query->query_type == PJ_DNS_TYPE_SRV) {
status = pj_dns_srv_resolve(&query->naptr[0].name,
&query->naptr[0].res_type,
query->req.def_port, pool, resolver->res,
PJ_TRUE, query, &srv_resolver_cb, NULL);
unsigned option = PJ_TRUE;
if (type & PJSIP_TRANSPORT_IPV6) {
option |= PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6;
} else {
option |= PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4;
}
status = pj_dns_srv_resolve(&query->naptr[0].name,
&query->naptr[0].res_type,
query->req.def_port, pool, resolver->res,
option, query, &srv_resolver_cb, NULL);
} else if (query->query_type == PJ_DNS_TYPE_A) {
status = pj_dns_resolver_start_query(resolver->res,
status = pj_dns_resolver_start_query(resolver->res,
&query->naptr[0].name,
PJ_DNS_TYPE_A, 0,
&dns_a_callback,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment