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; }
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(¶m, 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; }