dinoco

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

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:
Mdinoco.1 | 11++++++++++-
Mdinoco.c | 105++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mdinoco.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; };