summaryrefslogtreecommitdiff
path: root/src/zscanner/test/processing.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zscanner/test/processing.c')
-rw-r--r--src/zscanner/test/processing.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/zscanner/test/processing.c b/src/zscanner/test/processing.c
new file mode 100644
index 0000000..b9319d5
--- /dev/null
+++ b/src/zscanner/test/processing.c
@@ -0,0 +1,212 @@
+/* Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include "zscanner/scanner_functions.h"
+
+#include <inttypes.h> // PRIu64
+#include <stdio.h> // printf
+
+#include "common/errcode.h" // knot_strerror
+#include "common/descriptor.h" // knot_rrtype_to_string
+#include "zscanner/scanner.h" // scanner_t
+
+#define ERROR_CODE_TO_STRING(code) [code - ZSCANNER_UNCOVERED_STATE] = #code
+const char *error_names[] = {
+ ERROR_CODE_TO_STRING(ZSCANNER_UNCOVERED_STATE),
+ ERROR_CODE_TO_STRING(ZSCANNER_ELEFT_PARENTHESIS),
+ ERROR_CODE_TO_STRING(ZSCANNER_ERIGHT_PARENTHESIS),
+ ERROR_CODE_TO_STRING(ZSCANNER_EUNSUPPORTED_TYPE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_PREVIOUS_OWNER),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_DNAME_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_OWNER),
+ ERROR_CODE_TO_STRING(ZSCANNER_ELABEL_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EDNAME_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_NUMBER),
+ ERROR_CODE_TO_STRING(ZSCANNER_ENUMBER64_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_ENUMBER32_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_ENUMBER16_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_ENUMBER8_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EFLOAT_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_ERDATA_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EITEM_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_ADDRESS_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_IPV4),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_IPV6),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_GATEWAY),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_GATEWAY_KEY),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_APL),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_RDATA),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_HEX_RDATA),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_HEX_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_BASE64_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_BASE32HEX_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_REST),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TIMESTAMP_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TIMESTAMP_LENGTH),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TIMESTAMP),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_DATE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TIME),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TIME_UNIT),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_BITMAP),
+ ERROR_CODE_TO_STRING(ZSCANNER_ETEXT_OVERFLOW),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TEXT_CHAR),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TEXT),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_DIRECTIVE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_TTL),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_ORIGIN),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_INCLUDE_FILENAME),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_INCLUDE_ORIGIN),
+ ERROR_CODE_TO_STRING(ZSCANNER_EUNPROCESSED_INCLUDE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EUNOPENED_INCLUDE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_RDATA_LENGTH),
+ ERROR_CODE_TO_STRING(ZSCANNER_ECANNOT_TEXT_DATA),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_LOC_DATA),
+ ERROR_CODE_TO_STRING(ZSCANNER_EUNKNOWN_BLOCK),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_ALGORITHM),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_CERT_TYPE),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_EUI_LENGTH),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_L64_LENGTH),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_CHAR_COLON),
+ ERROR_CODE_TO_STRING(ZSCANNER_EBAD_CHAR_DASH),
+};
+#define ERROR_CODE_NAME(code) error_names[code - ZSCANNER_UNCOVERED_STATE]
+
+const char *separator = "------\n";
+
+static void print_wire_dname(const uint8_t *dname, uint32_t dname_length)
+{
+ uint32_t label_length = 0, i = 0;
+
+ for (i = 0; i < dname_length; i++) {
+ if (label_length == 0) {
+ label_length = dname[i];
+ printf("(%u)", label_length);
+ continue;
+ }
+ printf("%c", (char)dname[i]);
+ label_length--;
+ }
+}
+
+void empty_process(const scanner_t *s)
+{
+ (void)s;
+}
+
+void debug_process_error(const scanner_t *s)
+{
+ if (s->stop == true) {
+ printf("LINE(%03"PRIu64") ERROR(%s) FILE(%s) NEAR(%s)\n",
+ s->line_counter,
+ knot_strerror(s->error_code),
+ s->file_name,
+ s->buffer);
+ } else {
+ printf("LINE(%03"PRIu64") WARNING(%s) FILE(%s) NEAR(%s)\n",
+ s->line_counter,
+ knot_strerror(s->error_code),
+ s->file_name,
+ s->buffer);
+ }
+ fflush(stdout);
+}
+
+void debug_process_record(const scanner_t *s)
+{
+ uint32_t block, block_length, i;
+
+ char rclass[32];
+ char rtype[32];
+
+ if (knot_rrclass_to_string(s->r_class, rclass, sizeof(rclass)) > 0 &&
+ knot_rrtype_to_string(s->r_type, rtype, sizeof(rtype)) > 0) {
+ printf("LINE(%03"PRIu64") %s %u %*s ",
+ s->line_counter, rclass, s->r_ttl, 5, rtype);
+ } else {
+ printf("LINE(%03"PRIu64") %u %u %*u ",
+ s->line_counter, s->r_class, s->r_ttl, 5, s->r_type);
+ }
+
+ print_wire_dname(s->r_owner, s->r_owner_length);
+
+ printf(" #%u/%uB:", s->r_data_blocks_count, s->r_data_length);
+
+ for (block = 1; block <= s->r_data_blocks_count; block++) {
+ block_length =
+ s->r_data_blocks[block] - s->r_data_blocks[block - 1];
+ printf(" (%u)", block_length);
+
+ for (i = s->r_data_blocks[block - 1];
+ i < s->r_data_blocks[block];
+ i++) {
+ printf("%02X", (s->r_data)[i]);
+ }
+ }
+ printf("\n");
+ fflush(stdout);
+}
+
+void test_process_error(const scanner_t *s)
+{
+ if (s->stop == true) {
+ printf("ERROR=%s\n%s", ERROR_CODE_NAME(s->error_code), separator);
+ } else {
+ printf("WARNG=%s\n%s", ERROR_CODE_NAME(s->error_code), separator);
+ }
+ fflush(stdout);
+}
+
+void test_process_record(const scanner_t *s)
+{
+ uint32_t block, i;
+
+ printf("OWNER=");
+ for (i = 0; i < s->r_owner_length; i++) {
+ printf("%02X", s->r_owner[i]);
+ }
+ printf("\n");
+ printf("CLASS=%04X\n", s->r_class);
+ printf("RRTTL=%08X\n", s->r_ttl);
+ printf("RTYPE=%04X\n", s->r_type);
+ printf("RDATA=");
+ for (block = 1; block <= s->r_data_blocks_count; block++) {
+ if (block > 1) {
+ printf(" ");
+ }
+
+ for (i = s->r_data_blocks[block - 1];
+ i < s->r_data_blocks[block];
+ i++) {
+ printf("%02X", (s->r_data)[i]);
+ }
+ }
+ printf("\n%s", separator);
+ fflush(stdout);
+}
+
+void dump_rdata(const scanner_t *s)
+{
+ uint32_t block, i;
+
+ for (block = 1; block <= s->r_data_blocks_count; block++) {
+ for (i = s->r_data_blocks[block - 1];
+ i < s->r_data_blocks[block];
+ i++) {
+ printf("%c", (s->r_data)[i]);
+ }
+ }
+}