commit 7c4b26f8a64da18ca42033be3e615569c6de2e12
parent 3656c9664d8902c30c845a7932d4e0dd6ea36683
Author: Nibo <kroekerrobin@gmail.com>
Date: Fri, 23 Jun 2023 16:55:18 +0200
Add support for TXT records
Diffstat:
| M | dinoco.c | | | 42 | ++++++++++++++++++++++++++++++++++++++++-- |
| M | dinoco.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;
};