Exemple #1
0
dns_cache_rrset_t *
dns_engine_query(dns_msg_question_t *q, dns_config_zone_t *zone, dns_tls_t *tls)
{
    int rcode, noerror = 0;
    dns_engine_t *engine;
    dns_engine_param_t param;
    dns_cache_rrset_t *rrset;
    dns_config_zone_engine_t *ze;

    if ((rrset = dns_cache_new(q, tls)) == NULL) {
        plog(LOG_ERR, "%s: can't allocate new cache", MODULE);
        return NULL;
    }

    ze = (dns_config_zone_engine_t *) dns_list_head(&zone->z_search.zs_engine);
    while (ze != NULL) {
        engine = (dns_engine_t *) ze->ze_engine;

        if (engine->eng_query != NULL) {
            plog(LOG_DEBUG, "%s: query \"%s\" engine", MODULE, engine->eng_name);

            dns_cache_setrcode(rrset, DNS_RCODE_NOERROR);
            param.ep_zone = zone;
            param.ep_conf = ze->ze_econf;

            if (engine->eng_query(&param, rrset, q, tls) < 0) {
                dns_cache_release(rrset, tls);
                return NULL;
            }

            rcode = dns_cache_getrcode(rrset);
            plog(LOG_DEBUG, "%s: rcode %d (%s)", MODULE, rcode, dns_proto_rcode_string(rcode));

            if (rcode == DNS_RCODE_NOERROR)
                noerror = 1;
            if (rcode != DNS_RCODE_NOERROR && rcode != DNS_RCODE_NXDOMAIN)
                return rrset;

            // XXX merge answers?
            if (dns_cache_count_answer(rrset) > 0)
                return rrset;
        }

        ze = (dns_config_zone_engine_t *) dns_list_next(&zone->z_search.zs_engine, &ze->ze_elem);
    }

    dns_cache_setrcode(rrset, (noerror) ? DNS_RCODE_NOERROR : DNS_RCODE_NXDOMAIN);
    dns_cache_negative(rrset, 0);

    return rrset;
}
Exemple #2
0
void
plog_response(int level, struct sockaddr *to, char sockchar, dns_msg_question_t *q, dns_header_t *h)
{
    int rcode;
    char buf[256];

    if (LogFlags & DNS_LOG_FLAG_QUERY) {
        dns_util_sa2str(buf, sizeof(buf), to);
        rcode = DNS_RCODE(ntohs(h->hdr_flags));

        plog(level, "response to %s %c: %s %s %s %s",
             buf, sockchar,
             dns_proto_rcode_string(rcode),
             q->mq_name,
             dns_proto_class_string(q->mq_class),
             dns_proto_type_string(q->mq_type));
    }
}