Beispiel #1
0
static void node_dump_text(knot_node_t *node, void *data)
{
    dump_params_t *params = (dump_params_t *)data;

    // Zone apex rrsets.
    if (node->owner == params->origin) {
        apex_node_dump_text(node, params);
        return;
    }

    const knot_rrset_t **rrsets = knot_node_rrsets(node);

    // Dump non-apex rrsets.
    for (uint16_t i = 0; i < node->rrset_count; i++) {
        if (knot_rrset_txt_dump(rrsets[i], params->buf, params->buflen,
                                params->style) < 0) {
            params->ret = KNOT_ENOMEM;
            free(rrsets);
            return;
        }
        params->rr_count += rrsets[i]->rdata_count;
        if (rrsets[i]->rrsigs != NULL) {
            params->rr_count += rrsets[i]->rrsigs->rdata_count;
        }
        fprintf(params->file, "%s", params->buf);
    }

    free(rrsets);

    params->ret = KNOT_EOK;
}
Beispiel #2
0
static void apex_node_dump_text(knot_node_t *node, dump_params_t *params)
{
    knot_rrset_t *rr = knot_node_get_rrset(node, KNOT_RRTYPE_SOA);

    // Dump SOA record as a first.
    if (knot_rrset_txt_dump(rr, params->buf, params->buflen,
                            params->style) < 0) {
        params->ret = KNOT_ENOMEM;
        return;
    }
    params->rr_count += rr->rdata_count;
    if (rr->rrsigs != NULL) {
        params->rr_count += rr->rrsigs->rdata_count;
    }
    fprintf(params->file, "%s", params->buf);

    const knot_rrset_t **rrsets = knot_node_rrsets(node);

    // Dump other records.
    for (uint16_t i = 0; i < node->rrset_count; i++) {
        if (rrsets[i]->type != KNOT_RRTYPE_SOA) {
            if (knot_rrset_txt_dump(rrsets[i], params->buf,
                                    params->buflen, params->style)
                    < 0) {
                params->ret = KNOT_ENOMEM;
                free(rrsets);
                return;
            }
            params->rr_count += rrsets[i]->rdata_count;
            if (rrsets[i]->rrsigs != NULL) {
                params->rr_count +=
                    rrsets[i]->rrsigs->rdata_count;
            }
            fprintf(params->file, "%s", params->buf);
        }
    }

    free(rrsets);

    params->ret = KNOT_EOK;
}
Beispiel #3
0
static void print_section_full(const knot_rrset_t *rrsets,
                               const uint16_t     count,
                               const style_t      *style,
                               const bool         no_tsig)
{
    size_t buflen = 8192;
    char   *buf = calloc(buflen, 1);

    for (size_t i = 0; i < count; i++) {
        // Ignore OPT records.
        if (rrsets[i].type == KNOT_RRTYPE_OPT) {
            continue;
        }

        // Exclude TSIG record.
        if (no_tsig && rrsets[i].type == KNOT_RRTYPE_TSIG) {
            continue;
        }

        while (knot_rrset_txt_dump(&rrsets[i], buf, buflen,
                                   &(style->style)) < 0) {
            buflen += 4096;
            // Oversize protection.
            if (buflen > 100000) {
                WARN("can't print whole section\n");
                break;
            }

            char *newbuf = realloc(buf, buflen);
            if (newbuf == NULL) {
                WARN("can't print whole section\n");
                break;
            }
            buf = newbuf;
        }
        printf("%s", buf);
    }

    free(buf);
}