From 93e3ef0f64a5a3b931947b9fa7560e9d29db3bdc Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Thu, 12 Feb 2009 21:15:20 +0000 Subject: [PATCH] Thu Feb 12 14:20:26 CST 2009 Pekka Pessi * sres.c: improve logging upon errors git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11950 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/sofia-sip/.update | 2 +- .../sresolv/sofia-resolv/sres_record.h | 8 +++- libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c | 43 +++++++++++++++++-- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 28c5db7694..3bade995f1 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Thu Feb 12 15:14:36 CST 2009 +Thu Feb 12 15:15:10 CST 2009 diff --git a/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_record.h b/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_record.h index 0edba479ad..80a61bbc4a 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_record.h +++ b/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_record.h @@ -71,7 +71,10 @@ enum sres_status { /* Errors generated by sresolv */ SRES_TIMEOUT_ERR = 32, /**< Timeout occurred */ - SRES_RECORD_ERR = 33 /**< Name has no given record type */ + SRES_RECORD_ERR = 33, /**< Name has no given record type */ + SRES_INTERNAL_ERR = 34, /**< Internal error */ + + _SRES_LAST_ERR }; /** Start of a zone of authority record (@RFC1035). */ @@ -248,6 +251,9 @@ enum sres_qtypes { /** Convert type to its name. */ SRESPUBFUN char const *sres_record_type(int type, char buffer[8]); +/** Convert status to its name. */ +SRESPUBFUN char const *sres_record_status(int status, char buffer[8]); + /** Compare two records. */ SRESPUBFUN int sres_record_compare(sres_record_t const *, sres_record_t const *); diff --git a/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c b/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c index 67837c844a..8493b3e803 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c +++ b/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c @@ -1538,6 +1538,30 @@ char const *sres_record_type(int type, char buffer[8]) } } +/** Convert record status to its name */ +char const *sres_record_status(int status, char buffer[8]) +{ + switch (status) { + case SRES_OK: return "OK"; + case SRES_FORMAT_ERR: return "FORMAT_ERR"; + case SRES_SERVER_ERR: return "SERVER_ERR"; + case SRES_NAME_ERR: return "NAME_ERR"; + case SRES_UNIMPL_ERR: return "UNIMPL_ERR"; + case SRES_AUTH_ERR: return "AUTH_ERR"; + + /* Errors generated by sresolv */ + case SRES_TIMEOUT_ERR: return "TIMEOUT_ERR"; + case SRES_RECORD_ERR: return "RECORD_ERR"; + case SRES_INTERNAL_ERR: return "INTERNAL_ERR"; + + default: + if (buffer) + sprintf(buffer, "%u?", status & 255); + return buffer; + } +} + + /** Convert class to its name. */ static char const * sres_record_class(int rclass, char buffer[8]) @@ -2899,6 +2923,9 @@ sres_query_report_error(sres_query_t *q, int i; if (q->q_callback) { + char sbuf[8], tbuf[8]; + int status = 0; + for (i = 0; i <= SRES_MAX_SEARCH; i++) { if (q->q_subqueries[i]) /* a pending query... */ return; @@ -2910,8 +2937,16 @@ sres_query_report_error(sres_query_t *q, } } - SU_DEBUG_5(("sres(q=%p): reporting errors for %u %s\n", - (void *)q, q->q_type, q->q_name)); + for (i = 0; answers[i]; i++) { + status = answers[i]->sr_record->r_status; + if (status) + break; + } + + SU_DEBUG_5(("sres(q=%p): reporting error %s for %s %s\n", + (void *)q, + sres_record_status(status, sbuf), + sres_record_type(q->q_type, tbuf), q->q_name)); sres_remove_query(q->q_res, q, 1); (q->q_callback)(q->q_context, q, answers); @@ -3567,7 +3602,9 @@ sres_decode_msg(sres_resolver_t *res, } if (i < total) { - SU_DEBUG_5(("sres_decode_msg: %s\n", "less records than promised")); + SU_DEBUG_5(("sres_decode_msg: got %u but expected " + "errors=%u an=%u ar=%u ns=%u\n", i, errorcount, + m->m_ancount, m->m_arcount, m->m_nscount)); for (i = 0; i < total; i++) sres_cache_free_record(res->res_cache, answers[i]); su_free(chome, answers);