dinoco

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

commit 7c4b26f8a64da18ca42033be3e615569c6de2e12
parent 3656c9664d8902c30c845a7932d4e0dd6ea36683
Author: Nibo <kroekerrobin@gmail.com>
Date:   Fri, 23 Jun 2023 16:55:18 +0200

Add support for TXT records

Diffstat:
Mdinoco.c | 42++++++++++++++++++++++++++++++++++++++++--
Mdinoco.h | 12++++++++++++
2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/dinoco.c b/dinoco.c @@ -385,6 +385,9 @@ union dns_type_result *parseAnswerByType case TYPE_MF: break; case TYPE_CNAME: + ur->cname = malloc(sizeof(struct dns_cname_result)); + int startOfCanonicalDomain = *startOfNextAnswer - answer->rdlength; + ur->cname->domain = parseDomain(res, startOfCanonicalDomain); break; case TYPE_SOA: break; @@ -413,6 +416,17 @@ union dns_type_result *parseAnswerByType ur->mx->mailDomain = parseDomain(res, startOfMailDomain); break; case TYPE_TXT: + ur->txt = malloc(sizeof(struct dns_txt_result)); + ur->txt->data = NULL; + int txtLength = answer->rdata->bytes[0]; + int i = 0; + for (; i<txtLength; i++) + { + ur->txt->data = realloc(ur->txt->data, (i+1) * sizeof(char)); + ur->txt->data[i] = answer->rdata->bytes[i+1]; + } + ur->txt->data = realloc(ur->txt->data, (i+1) * sizeof(char)); + ur->txt->data[i] = 0; break; } free(answer->rdata->bytes); @@ -467,6 +481,18 @@ void printAnswers case TYPE_MF: break; case TYPE_CNAME: + if (!disableHeader) + printf(ANSI_COLOR_GREEN"Canonical Domain\n"ANSI_COLOR_RESET); + for (int i=0; i<answerCount; i++) + { + printf("%s\n", answers[i]->cname->domain); + } + for (int i=0; i<answerCount; i++) + { + free(answers[i]->cname->domain); + free(answers[i]->cname); + free(answers[i]); + } break; case TYPE_SOA: break; @@ -512,6 +538,18 @@ void printAnswers } break; case TYPE_TXT: + if (!disableHeader) + printf(ANSI_COLOR_GREEN"TXT Data\n"ANSI_COLOR_RESET); + for (int i=0; i<answerCount; i++) + { + printf("%s\n", answers[i]->txt->data); + } + for (int i=0; i<answerCount; i++) + { + free(answers[i]->txt->data); + free(answers[i]->txt); + free(answers[i]); + } break; } free(answers); @@ -576,13 +614,13 @@ bool isValidResponse(struct dns_header *reqHeader, struct dns_header *resHeader) { if (reqHeader->id != resHeader->id) return false; - if (resHeader->ancount < reqHeader->qdcount) - return false; if (resHeader->rcode != RCODE_NO_ERROR) { printf("%s\n", getRCODEString(resHeader->rcode)); return false; } + if (resHeader->ancount < reqHeader->qdcount) + return false; return true; } diff --git a/dinoco.h b/dinoco.h @@ -127,9 +127,21 @@ struct dns_ns_result char *domain; }; +struct dns_cname_result +{ + char *domain; +}; + +struct dns_txt_result +{ + char *data; +}; + union dns_type_result { struct dns_mx_result *mx; struct dns_a_result *a; struct dns_ns_result *ns; + struct dns_cname_result *cname; + struct dns_txt_result *txt; };