From 9036ed0809f2ce527997dfbeec3fb5435421cafe Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 23 Jun 2009 19:49:03 +0000 Subject: [PATCH] Tue Jun 23 09:58:14 CDT 2009 Pekka Pessi * sres.c: use original query with callback when doing CNAME recurse git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13922 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/sofia-sip/.update | 2 +- libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c | 54 +++++++++++++------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 6de4db0d78..08d191c0f4 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Jun 23 14:47:41 CDT 2009 +Tue Jun 23 14:48:11 CDT 2009 diff --git a/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c b/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c index 63e1302a30..f660b2ce22 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c +++ b/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c @@ -324,7 +324,6 @@ struct sres_query_s { uint16_t q_retry_count; uint8_t q_n_servers; uint8_t q_i_server; - int8_t q_aliased; int8_t q_edns; uint8_t q_n_subs; sres_query_t *q_subqueries[1 + SRES_MAX_SEARCH]; @@ -404,6 +403,7 @@ static int sres_config_changed_servers(sres_config_t const *new_c, sres_config_t const *old_c); static sres_server_t **sres_servers_new(sres_resolver_t *res, sres_config_t const *c); +static sres_answer_f sres_resolving_cname; /** Generate new 16-bit identifier for DNS query. */ static void @@ -3083,15 +3083,35 @@ sres_resend_dns_query(sres_resolver_t *res, sres_query_t *q, int timeout) static void sres_resolve_cname(sres_resolver_t *res, - const sres_query_t *orig_query, - const char *alias) + sres_query_t *orig_query, + char const *cname) { sres_query_t *query; + query = sres_query_alloc(res, - orig_query->q_callback, orig_query->q_context, orig_query->q_type, - alias); - query->q_aliased = 1; - sres_send_dns_query(res, query); + sres_resolving_cname, + (sres_context_t *)orig_query, + orig_query->q_type, + cname); + + if (query) + sres_send_dns_query(res, query); + else + sres_query_report_error(orig_query, NULL); +} + +static void +sres_resolving_cname(sres_context_t *original_query, + sres_query_t *query, + sres_record_t **answers) +{ + sres_query_t *orig = (sres_query_t *)original_query; + + /* Notify the listener */ + if (orig->q_callback != NULL) + (orig->q_callback)(orig->q_context, orig, answers); + + sres_free_query(orig->q_res, orig); } /** Get a server by socket */ @@ -3486,17 +3506,18 @@ sres_resolver_receive(sres_resolver_t *res, int socket) if (sres_cache_get(res->res_cache, query->q_type, alias, &cached) > 0) { reply = cached; - } else { - /* Resubmit the query with the aliased name, dropping this result */ + } + else { + /* Submit a query with the aliased name, dropping this result */ sres_resolve_cname(res, query, alias); - reply = NULL; + return 1; } } - if (reply) { - /* Notify the listener */ - if (query->q_callback != NULL) - (query->q_callback)(query->q_context, query, reply); - } + + /* Notify the listener */ + if (query->q_callback != NULL) + (query->q_callback)(query->q_context, query, reply); + sres_free_query(res, query); } else { @@ -3670,7 +3691,8 @@ sres_decode_msg(sres_resolver_t *res, } if (m->m_ancount > 0 && errorcount == 0 && query->q_type < sres_qtype_tsig - && (query->q_aliased || answers[0]->sr_type != sres_type_cname)) { + && (query->q_callback == sres_resolving_cname || + answers[0]->sr_type != sres_type_cname)) { for (i = 0; i < m->m_ancount; i++) { if (query->q_type == answers[i]->sr_type)