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:
| M | dinoco.c | | | 89 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
| M | dinoco.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;
};