diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-11-20 09:47:32 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-11-20 09:47:32 +0000 |
commit | b7375dded805157bed596529dd1a0015a9ceb5b3 (patch) | |
tree | 88b814eea49988b8208160a9ed13941a54a56f0e /pjlib-util/src | |
parent | 07ff91da6934c2afecec7061a7ffa6a9cf55c19b (diff) |
Ticket #419: initial support for DNS AAAA resolution
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1587 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util/src')
-rw-r--r-- | pjlib-util/src/pjlib-util/dns.c | 8 | ||||
-rw-r--r-- | pjlib-util/src/pjlib-util/dns_dump.c | 5 | ||||
-rw-r--r-- | pjlib-util/src/pjlib-util/srv_resolver.c | 10 |
3 files changed, 19 insertions, 4 deletions
diff --git a/pjlib-util/src/pjlib-util/dns.c b/pjlib-util/src/pjlib-util/dns.c index f8bc9008..53066add 100644 --- a/pjlib-util/src/pjlib-util/dns.c +++ b/pjlib-util/src/pjlib-util/dns.c @@ -29,6 +29,7 @@ PJ_DEF(const char *) pj_dns_get_type_name(int type) { switch (type) { case PJ_DNS_TYPE_A: return "A"; + case PJ_DNS_TYPE_AAAA: return "AAAA"; case PJ_DNS_TYPE_SRV: return "SRV"; case PJ_DNS_TYPE_NS: return "NS"; case PJ_DNS_TYPE_CNAME: return "CNAME"; @@ -346,6 +347,10 @@ static pj_status_t parse_rr(pj_dns_parsed_rr *rr, pj_pool_t *pool, pj_memcpy(&rr->rdata.a.ip_addr, p, 4); p += 4; + } else if (rr->type == PJ_DNS_TYPE_AAAA) { + pj_memcpy(&rr->rdata.aaaa.ip_addr, p, 16); + p += 16; + } else if (rr->type == PJ_DNS_TYPE_CNAME || rr->type == PJ_DNS_TYPE_NS || rr->type == PJ_DNS_TYPE_PTR) @@ -591,6 +596,9 @@ static void copy_rr(pj_pool_t *pool, pj_dns_parsed_rr *dst, pool, &dst->rdata.srv.target); } else if (src->type == PJ_DNS_TYPE_A) { dst->rdata.a.ip_addr.s_addr = src->rdata.a.ip_addr.s_addr; + } else if (src->type == PJ_DNS_TYPE_AAAA) { + pj_memcpy(&dst->rdata.aaaa.ip_addr, &src->rdata.aaaa.ip_addr, + sizeof(pj_in6_addr)); } else if (src->type == PJ_DNS_TYPE_CNAME) { pj_strdup(pool, &dst->rdata.cname.name, &src->rdata.cname.name); } else if (src->type == PJ_DNS_TYPE_NS) { diff --git a/pjlib-util/src/pjlib-util/dns_dump.c b/pjlib-util/src/pjlib-util/dns_dump.c index d493323a..6bb5cdc2 100644 --- a/pjlib-util/src/pjlib-util/dns_dump.c +++ b/pjlib-util/src/pjlib-util/dns_dump.c @@ -117,6 +117,11 @@ static void dump_answer(unsigned index, const pj_dns_parsed_rr *rr) } else if (rr->type == PJ_DNS_TYPE_A) { PJ_LOG(3,(THIS_FILE, " IP address: %s", pj_inet_ntoa(rr->rdata.a.ip_addr))); + } else if (rr->type == PJ_DNS_TYPE_AAAA) { + char addr[PJ_INET6_ADDRSTRLEN]; + PJ_LOG(3,(THIS_FILE, " IPv6 address: %s", + pj_inet_ntop(pj_AF_INET6(), &rr->rdata.aaaa.ip_addr, + addr, sizeof(addr)))); } } diff --git a/pjlib-util/src/pjlib-util/srv_resolver.c b/pjlib-util/src/pjlib-util/srv_resolver.c index a6af7ac3..ca5892d8 100644 --- a/pjlib-util/src/pjlib-util/srv_resolver.c +++ b/pjlib-util/src/pjlib-util/srv_resolver.c @@ -55,7 +55,7 @@ typedef struct pj_dns_srv_resolver_job pj_status_t last_error; /* Original request: */ - pj_bool_t fallback_a; + unsigned option; pj_str_t full_name; pj_str_t domain_part; pj_uint16_t def_port; @@ -85,7 +85,7 @@ PJ_DEF(pj_status_t) pj_dns_srv_resolve( const pj_str_t *domain_name, unsigned def_port, pj_pool_t *pool, pj_dns_resolver *resolver, - pj_bool_t fallback_a, + unsigned option, void *token, pj_dns_srv_resolver_cb *cb, pj_dns_async_query **p_query) @@ -116,7 +116,7 @@ PJ_DEF(pj_status_t) pj_dns_srv_resolve( const pj_str_t *domain_name, query_job->resolver = resolver; query_job->token = token; query_job->cb = cb; - query_job->fallback_a = fallback_a; + query_job->option = option; query_job->full_name = target_name; query_job->domain_part.ptr = target_name.ptr + len; query_job->domain_part.slen = target_name.slen - len; @@ -417,7 +417,9 @@ static void dns_callback(void *user_data, errmsg)); /* Trigger error when fallback is disabled */ - if (query_job->fallback_a == PJ_FALSE) { + if ((query_job->option & + (PJ_DNS_SRV_FALLBACK_A | PJ_DNS_SRV_FALLBACK_AAAA)) == 0) + { goto on_error; } } |