/* 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). */
/** 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 *);
}
}
+/** 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])
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;
}
}
- 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);
}
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);