dinoco

Query DNS records
git clone git://git.relim.de/dinoco.git
Log | Files | Refs | README | LICENSE

commit 58a84b31bacbc314fbc23569f027970935c0ef41
parent 9cee0985fb317047455c012836841c92995fda3b
Author: Nibo <kroekerrobin@gmail.com>
Date:   Sat, 24 Jun 2023 14:58:43 +0200

Add support for SOA DNS records

Diffstat:
Mdinoco.c | 89++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mdinoco.h | 12++++++++++++
2 files changed, 100 insertions(+), 1 deletion(-)

diff --git a/dinoco.c b/dinoco.c @@ -298,14 +298,21 @@ int findNameLength(struct byte_array *res, int start) { int length = 0; int i = start; - while (res->bytes[i] != 0) + while (1) { + if (res->bytes[i] == 0) + { + length++; + break; + } + // If pointer if ((res->bytes[i] & 0xFF) == 0xC0) { length += 2; break; } length++; + i++; } return length; } @@ -390,6 +397,39 @@ union dns_type_result *parseAnswerByType ur->cname->domain = parseDomain(res, startOfCanonicalDomain); break; case TYPE_SOA: + ur->soa = malloc(sizeof(struct dns_soa_result)); + int start = *startOfNextAnswer - answer->rdlength; + ur->soa->mname = parseDomain(res, start); + int mnameLength = findNameLength(res, start); + start += mnameLength; + printf("start: %d\n", start); + ur->soa->rname = parseDomain(res, start); + int rnameLength = findNameLength(res, start); + start += rnameLength; + ur->soa->serial = ((uint32_t)(res->bytes[start] & 0xFF) << 24) + + ((uint32_t)(res->bytes[start+1] & 0xFF) << 16) + + ((uint32_t)(res->bytes[start+2] & 0xFF) << 8) + + (uint32_t)(res->bytes[start+3] & 0xFF); + start += 4; + ur->soa->refresh = ((uint32_t)(res->bytes[start] & 0xFF) << 24) + + ((uint32_t)(res->bytes[start+1] & 0xFF) << 16) + + ((uint32_t)(res->bytes[start+2] & 0xFF) << 8) + + (uint32_t)(res->bytes[start+3] & 0xFF); + start += 4; + ur->soa->retry = ((uint32_t)(res->bytes[start] & 0xFF) << 24) + + ((uint32_t)(res->bytes[start+1] & 0xFF) << 16) + + ((uint32_t)(res->bytes[start+2] & 0xFF) << 8) + + (uint32_t)(res->bytes[start+3] & 0xFF); + start += 4; + ur->soa->expire = ((uint32_t)(res->bytes[start] & 0xFF) << 24) + + ((uint32_t)(res->bytes[start+1] & 0xFF) << 16) + + ((uint32_t)(res->bytes[start+2] & 0xFF) << 8) + + (uint32_t)(res->bytes[start+3] & 0xFF); + start += 4; + ur->soa->minimum = ((uint32_t)(res->bytes[start] & 0xFF) << 24) + + ((uint32_t)(res->bytes[start+1] & 0xFF) << 16) + + ((uint32_t)(res->bytes[start+2] & 0xFF) << 8) + + (uint32_t)(res->bytes[start+3] & 0xFF); break; case TYPE_MB: break; @@ -446,6 +486,7 @@ void printAnswers bool disableHeader ) { + int len = 0; switch (type) { case TYPE_A: @@ -495,6 +536,52 @@ void printAnswers } break; case TYPE_SOA: + int longestMName = 0; + for (int i=0; i<answerCount; i++) + { + if ((len = strlen(answers[i]->soa->mname)) > longestMName) + longestMName = len; + } + len = 0; + if (longestMName < 19) + longestMName = 19; + int longestRName = 0; + for (int i=0; i<answerCount; i++) + { + if ((len = strlen(answers[i]->soa->rname)) > longestRName) + longestRName = len; + } + if (longestRName < 31) + longestRName = 31; + if (!disableHeader) + printf(ANSI_COLOR_GREEN); + printf("%-*s\t", longestMName, "Primary Name Server"); + printf("%-*s\t", longestRName, "Responsible authority's mailbox"); + printf("%-13s\t", "Serial Number"); + printf("%-16s\t", "Refresh Interval"); + printf("%-14s\t", "Retry Interval"); + printf("%-12s\t", "Expire Limit"); + printf("%-11s", "Minimum TTL"); + printf("\n"); + printf(ANSI_COLOR_RESET); + for (int i=0; i<answerCount; i++) + { + printf("%-*s\t", longestMName, answers[i]->soa->mname); + printf("%-*s\t", longestRName, answers[i]->soa->rname); + printf("%-13u\t", answers[i]->soa->serial); + printf("%-16u\t", answers[i]->soa->refresh); + printf("%-14u\t", answers[i]->soa->retry); + printf("%-12u\t", answers[i]->soa->expire); + printf("%-11u", answers[i]->soa->minimum); + printf("\n"); + } + for (int i=0; i<answerCount; i++) + { + free(answers[i]->soa->mname); + free(answers[i]->soa->rname); + free(answers[i]->soa); + free(answers[i]); + } break; case TYPE_MB: break; diff --git a/dinoco.h b/dinoco.h @@ -137,6 +137,17 @@ struct dns_txt_result char *data; }; +struct dns_soa_result +{ + char *mname; + char *rname; + uint32_t serial; + uint32_t refresh; + uint32_t retry; + uint32_t expire; + uint32_t minimum; +}; + union dns_type_result { struct dns_mx_result *mx; @@ -144,4 +155,5 @@ union dns_type_result struct dns_ns_result *ns; struct dns_cname_result *cname; struct dns_txt_result *txt; + struct dns_soa_result *soa; };