int dns_engine_notify(dns_config_zone_t *zone, struct sockaddr *remote, dns_tls_t *tls) { int result = -1; dns_engine_t *engine; dns_engine_param_t param; dns_config_zone_engine_t *ze; 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_notify != NULL) { plog(LOG_DEBUG, "%s: notify \"%s\" engine", MODULE, engine->eng_name); param.ep_zone = zone; param.ep_conf = ze->ze_econf; if (engine->eng_notify(¶m, remote, tls) >= 0) result = 0; } ze = (dns_config_zone_engine_t *) dns_list_next(&zone->z_search.zs_engine, &ze->ze_elem); } return result; }
void dns_notify_all_slaves(void) { dns_config_zone_t *zone; zone = (dns_config_zone_t *) dns_list_head(&ConfigRoot->r_zone); while (zone != NULL) { dns_acl_each(&zone->z_slaves.zss_acl, zone->z_name, notify_each_addr4); zone = (dns_config_zone_t *) dns_list_next(&ConfigRoot->r_zone, &zone->z_elem); } }
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; }
int dns_engine_dump_init(dns_engine_dump_t *edump, dns_config_zone_t *zone) { dns_engine_t *engine; memset(edump, 0, sizeof(*edump)); edump->ed_zone = zone; edump->ed_ze = (dns_config_zone_engine_t *) dns_list_head(&zone->z_search.zs_engine); engine = (dns_engine_t *) edump->ed_ze->ze_engine; if (engine->eng_dumpnext == NULL) return -1; return 0; }