Esempio n. 1
0
static int
serverid_query(dns_engine_param_t *ep, dns_cache_rrset_t *rrset, dns_msg_question_t *q, dns_tls_t *tls)
{
    dns_cache_set_flags(rrset, DNS_FLAG_AA);

    if (q->mq_type == DNS_TYPE_TXT || q->mq_type == DNS_TYPE_ALL) {
        if (q->mq_class == DNS_CLASS_CH || q->mq_class == DNS_CLASS_ANY) {
            /* RFC4892 (id.server) */
            if (strcasecmp(q->mq_name, "id.server") == 0)
                return serverid_hostname(rrset, q, tls);
            if (strcasecmp(q->mq_name, "version.server") == 0)
                return serverid_version(rrset, q, tls);

            /* conventional resources */
            if (strcasecmp(q->mq_name, "hostname.bind") == 0)
                return serverid_hostname(rrset, q, tls);
            if (strcasecmp(q->mq_name, "version.bind") == 0)
                return serverid_version(rrset, q, tls);
        }
    }

    dns_cache_set_rcode(rrset, DNS_RCODE_NXDOMAIN);
    dns_cache_negative(rrset, 0);

    return 0;
}
Esempio n. 2
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;
}