summaryrefslogtreecommitdiffstats
path: root/dns.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2023-08-07 16:33:27 +0200
committermanuel <manuel@mausz.at>2023-08-07 16:33:27 +0200
commit696792f08106e5bea4a8847e394401c1a68ecf9c (patch)
treef8e5481c9a86c95ff2cdc4cd803e3c0ab180e48c /dns.c
parentae63d731e9c1d9a0403aac3ee0e680a6508dff07 (diff)
downloadqmail-696792f08106e5bea4a8847e394401c1a68ecf9c.tar.gz
qmail-696792f08106e5bea4a8847e394401c1a68ecf9c.tar.bz2
qmail-696792f08106e5bea4a8847e394401c1a68ecf9c.zip
add dns_tlsa(...) and dnstlsa utility
Diffstat (limited to 'dns.c')
-rw-r--r--dns.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/dns.c b/dns.c
index bed2bd2..b4d106c 100644
--- a/dns.c
+++ b/dns.c
@@ -418,3 +418,44 @@ unsigned long random;
418 alloc_free(mx); 418 alloc_free(mx);
419 return flagsoft; 419 return flagsoft;
420} 420}
421
422int dns_tlsa(stralloc *out, const stralloc *fqdn)
423{
424 int ranswers = 0;
425
426 switch(resolve(fqdn, T_TLSA))
427 {
428 case DNS_MEM: return DNS_MEM;
429 case DNS_SOFT: return DNS_SOFT;
430 case DNS_HARD: return DNS_HARD;
431 }
432
433 if (!stralloc_copys(out,"")) return DNS_MEM;
434 while(numanswers-- > 0) {
435 int i;
436 if (responsepos == responseend) return DNS_SOFT;
437
438 i = dn_expand(response.buf, responseend, responsepos, name, MAXDNAME);
439 if (i < 0) return DNS_SOFT;
440 responsepos += i;
441
442 i = responseend - responsepos;
443 if (i < 4 + 3 * 2) return DNS_SOFT;
444
445 unsigned short rrtype = getshort(responsepos);
446 unsigned short rrdlen = getshort(responsepos + 8);
447 responsepos += 10; // skip dns header
448 if (responsepos + rrdlen > responseend) return DNS_HARD;
449
450 if (rrtype == T_TLSA)
451 {
452 unsigned char rrlen[2] = { rrdlen >> 8, rrdlen & 0xFF };
453 stralloc_catb(out, rrlen, 2);
454 if (!stralloc_catb(out, responsepos, rrdlen)) return DNS_MEM;
455 ++ranswers;
456 }
457
458 responsepos += rrdlen;
459 }
460 return ranswers;
461}