commit 3cb54c83c2317f5b82063ab5f71dda1b46695571
parent d06610f163ae5c132b0b45915192792b4e911a36
Author: Nibo <kroekerrobin@gmail.com>
Date: Sun, 25 Jun 2023 16:38:50 +0200
Add support for AAAA DNS type
Diffstat:
| M | dinoco.1 | | | 11 | ++++++++++- |
| M | dinoco.c | | | 105 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
| M | dinoco.h | | | 45 | +++++++++++++++++++++++++++++++++++++++------ |
3 files changed, 151 insertions(+), 10 deletions(-)
diff --git a/dinoco.1 b/dinoco.1
@@ -19,8 +19,17 @@ A domain.
.TP
\fB\,-t\/\fR, \fB\,--type\/\fR \fI\,type\/\fR
A DNS type. One of the following:
+.B A,
+.B AAAA,
+.B NS,
+.B CNAME,
+.B SOA,
+.B PTR,
+.B HINFO,
+.B MX,
+.B TXT.
-A, NS, MD, MF, CNAME, SOA, MB, MG, MR, NULL, WKS, PTR, HINFO, MINFO, MX, TXT.
+Not (yet) supported types: WKS, MB, MD, MF, MG, MR, MINFO, NULL.
.TP
\fB\,-h\/\fR
Disable the printing of the header line.
diff --git a/dinoco.c b/dinoco.c
@@ -90,12 +90,12 @@ char *toUpper(char *string)
short parseType(char *arg)
{
- for (int i=0; i<16; i++)
+ for (int i=0; i<17; i++)
{
- if (strcmp(arg, types[i]) == 0)
+ if (strcmp(arg, types[i].string) == 0)
{
free(arg);
- return i+1;
+ return types[i].type;
}
}
free(arg);
@@ -149,6 +149,29 @@ struct byte_array *formDomain(char *domain)
return b;
}
+char *parseIPv6(char *data)
+{
+ char *ipv6 = NULL;
+ for (int i=0; i<16; i++)
+ {
+ data[i];
+ }
+}
+
+char *parseCharString(char *data, int start)
+{
+ char *string = NULL;
+ int i = 0;
+ for (; i<data[start]; i++)
+ {
+ string = realloc(string, (i+1) * sizeof(char));
+ string[i] = data[start+i+1];
+ }
+ string = realloc(string, (i+1) * sizeof(char));
+ string[i] = 0;
+ return string;
+}
+
char *parseDomain(struct byte_array *res, int start)
{
char *domain = NULL;
@@ -382,6 +405,31 @@ union dns_type_result *parseAnswerByType
ur->a->ipAddress = realloc(ur->a->ipAddress, (e+1) * sizeof(char));
ur->a->ipAddress[e] = 0;
break;
+ case TYPE_AAAA:
+ ur->aaaa = malloc(sizeof(struct dns_aaaa_result));
+ ur->aaaa->ipv6 = NULL;
+ char ipv6Part[3];
+ int s = 0;
+ for (int i=0; i<16; i++)
+ {
+ sprintf(ipv6Part, "%02x", answer->rdata->bytes[i] & 0xFF);
+ ipv6Part[2] = 0;
+ for (int k=0; k<strlen(ipv6Part); k++)
+ {
+ ur->aaaa->ipv6 = realloc(ur->aaaa->ipv6, (s+1) * sizeof(char));
+ ur->aaaa->ipv6[s] = ipv6Part[k];
+ s++;
+ }
+ if (i%2 != 0 && i != 15)
+ {
+ ur->aaaa->ipv6 = realloc(ur->aaaa->ipv6, (s+1) * sizeof(char));
+ ur->aaaa->ipv6[s] = ':';
+ s++;
+ }
+ }
+ ur->aaaa->ipv6 = realloc(ur->aaaa->ipv6, (s+1) * sizeof(char));
+ ur->aaaa->ipv6[s] = 0;
+ break;
case TYPE_NS:
ur->ns = malloc(sizeof(struct dns_ns_result));
int startOfDomain = *startOfNextAnswer - answer->rdlength;
@@ -446,6 +494,10 @@ union dns_type_result *parseAnswerByType
ur->ptr->domain = parseDomain(res, startOfPTRDomain);
break;
case TYPE_HINFO:
+ ur->hinfo = malloc(sizeof(struct dns_hinfo_result));
+ ur->hinfo->cpu = parseCharString(answer->rdata->bytes, 0);
+ int startOfOS = answer->rdata->bytes[0] + 1;
+ ur->hinfo->os = parseCharString(answer->rdata->bytes, startOfOS);
break;
case TYPE_MINFO:
break;
@@ -505,6 +557,24 @@ void printAnswers
free(answers[i]);
}
break;
+ case TYPE_AAAA:
+ if (!disableHeader)
+ {
+ printf(ANSI_COLOR_GREEN);
+ printf("AAAA Address\n");
+ printf(ANSI_COLOR_RESET);
+ }
+ for (int i=0; i<answerCount; i++)
+ {
+ printf("%s\n", answers[i]->aaaa->ipv6);
+ }
+ for (int i=0; i<answerCount; i++)
+ {
+ free(answers[i]->aaaa->ipv6);
+ free(answers[i]->aaaa);
+ free(answers[i]);
+ }
+ break;
case TYPE_NS:
if (!disableHeader)
printf(ANSI_COLOR_GREEN"Authoritative Host\n"ANSI_COLOR_RESET);
@@ -616,6 +686,35 @@ void printAnswers
}
break;
case TYPE_HINFO:
+ int longestCPU = 0;
+ len = 0;
+ for (int i=0; i<answerCount; i++)
+ {
+ if ((len = strlen(answers[i]->hinfo->cpu)) > longestCPU)
+ longestCPU = len;
+ }
+ if (longestCPU < 3)
+ longestCPU = 3;
+ if (!disableHeader)
+ {
+ printf(ANSI_COLOR_GREEN);
+ printf("CPU\t");
+ printf("OS\n");
+ printf(ANSI_COLOR_RESET);
+ }
+ for (int i=0; i<answerCount; i++)
+ {
+ printf("%-*s\t", longestCPU, answers[i]->hinfo->cpu);
+ printf("%-*s", longestCPU, answers[i]->hinfo->os);
+ printf("\n");
+ }
+ for (int i=0; i<answerCount; i++)
+ {
+ free(answers[i]->hinfo->cpu);
+ free(answers[i]->hinfo->os);
+ free(answers[i]->hinfo);
+ free(answers[i]);
+ }
break;
case TYPE_MINFO:
break;
diff --git a/dinoco.h b/dinoco.h
@@ -27,14 +27,34 @@ enum type
TYPE_HINFO,
TYPE_MINFO,
TYPE_MX,
- TYPE_TXT
+ TYPE_TXT,
+ TYPE_AAAA = 28
};
-const char *types[] = {
- "A", "NS", "MD", "MF",
- "CNAME", "SOA", "MB", "MG",
- "MR", "NULL", "WKS", "PTR",
- "HINFO", "MINFO", "MX", "TXT"
+struct typeMapping
+{
+ char *string;
+ enum type type;
+};
+
+const struct typeMapping types[] = {
+ { "A", TYPE_A },
+ { "NS", TYPE_NS },
+ { "MD", TYPE_MD },
+ { "MF", TYPE_MF },
+ { "CNAME", TYPE_CNAME },
+ { "SOA", TYPE_SOA },
+ { "MB", TYPE_MB },
+ { "MG", TYPE_MG },
+ { "MR", TYPE_MR },
+ { "NULL", TYPE_NULL },
+ { "WKS", TYPE_WKS },
+ { "PTR", TYPE_PTR },
+ { "HINFO", TYPE_HINFO },
+ { "MINFO", TYPE_MINFO },
+ { "MX", TYPE_MX },
+ { "TXT", TYPE_TXT },
+ { "AAAA", TYPE_AAAA }
};
enum class
@@ -153,6 +173,17 @@ struct dns_ptr_result
char *domain;
};
+struct dns_hinfo_result
+{
+ char *cpu;
+ char *os;
+};
+
+struct dns_aaaa_result
+{
+ char *ipv6;
+};
+
union dns_type_result
{
struct dns_mx_result *mx;
@@ -162,4 +193,6 @@ union dns_type_result
struct dns_txt_result *txt;
struct dns_soa_result *soa;
struct dns_ptr_result *ptr;
+ struct dns_hinfo_result *hinfo;
+ struct dns_aaaa_result *aaaa;
};