Example #1
0
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(&param, remote, tls) >= 0)
                result = 0;
        }

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

    return result;
}
Example #2
0
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);
    }
}
Example #3
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;
}
Example #4
0
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;
}