diff options
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsip/sip_endpoint.c | 9 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_resolve.c | 27 |
2 files changed, 36 insertions, 0 deletions
diff --git a/pjsip/src/pjsip/sip_endpoint.c b/pjsip/src/pjsip/sip_endpoint.c index d1f66b8c..b2094268 100644 --- a/pjsip/src/pjsip/sip_endpoint.c +++ b/pjsip/src/pjsip/sip_endpoint.c @@ -1128,6 +1128,15 @@ PJ_DEF(pj_status_t) pjsip_endpt_set_resolver( pjsip_endpoint *endpt, } /* + * Set DNS external resolver implementation to be used by the SIP resolver. + */ +PJ_DEF(pj_status_t) pjsip_endpt_set_ext_resolver(pjsip_endpoint *endpt, + pjsip_ext_resolver *ext_res) +{ + return pjsip_resolver_set_ext_resolver(endpt->resolver, ext_res); +} + +/* * Get the DNS resolver being used by the SIP resolver. */ PJ_DEF(pj_dns_resolver*) pjsip_endpt_get_resolver(pjsip_endpoint *endpt) diff --git a/pjsip/src/pjsip/sip_resolve.c b/pjsip/src/pjsip/sip_resolve.c index 03413ab8..943fb3c4 100644 --- a/pjsip/src/pjsip/sip_resolve.c +++ b/pjsip/src/pjsip/sip_resolve.c @@ -70,6 +70,7 @@ struct query struct pjsip_resolver_t { pj_dns_resolver *res; + pjsip_ext_resolver *ext_res; }; @@ -114,6 +115,26 @@ PJ_DEF(pj_status_t) pjsip_resolver_set_resolver(pjsip_resolver_t *res, #endif } +/* + * Public API to set the DNS external resolver implementation for the SIP + * resolver. + */ +PJ_DEF(pj_status_t) pjsip_resolver_set_ext_resolver(pjsip_resolver_t *res, + pjsip_ext_resolver *ext_res) +{ + if (ext_res && !ext_res->resolve) + return PJ_EINVAL; + + if (ext_res && res->res) { +#if PJSIP_HAS_RESOLVER + pj_dns_resolver_destroy(res->res, PJ_FALSE); +#endif + res->res = NULL; + } + res->ext_res = ext_res; + return PJ_SUCCESS; +} + /* * Public API to get the internal DNS resolver. @@ -175,6 +196,12 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, struct query *query; pjsip_transport_type_e type = target->type; + /* If an external implementation has been provided use it instead */ + if (resolver->ext_res) { + (*resolver->ext_res->resolve)(resolver, pool, target, token, cb); + return; + } + /* Is it IP address or hostname? And if it's an IP, which version? */ ip_addr_ver = get_ip_addr_ver(&target->addr.host); |