resolvectl: output slightly more data when --raw=payload is used

Let's also show A/AAAA data in binary form if --raw=payload is used. For
these RR types there's only a single data field, hence it's obbviously
meant.

Inspired by: #37737
This commit is contained in:
Lennart Poettering
2025-06-05 12:17:01 +02:00
parent 770489c1e0
commit 141894f53a
3 changed files with 15 additions and 9 deletions

View File

@@ -489,7 +489,7 @@ static int output_rr_packet(const void *d, size_t l, int ifindex) {
return r;
} else if (arg_raw == RAW_PAYLOAD) {
void *data;
const void *data;
ssize_t k;
k = dns_resource_record_payload(rr, &data);

View File

@@ -1355,9 +1355,9 @@ const char* dns_resource_record_to_string(DnsResourceRecord *rr) {
return TAKE_PTR(s);
}
ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
ssize_t dns_resource_record_payload(DnsResourceRecord *rr, const void **ret) {
assert(rr);
assert(out);
assert(ret);
switch (rr->unparsable ? _DNS_TYPE_INVALID : rr->key->type) {
case DNS_TYPE_SRV:
@@ -1368,8 +1368,6 @@ ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
case DNS_TYPE_HINFO:
case DNS_TYPE_SPF:
case DNS_TYPE_TXT:
case DNS_TYPE_A:
case DNS_TYPE_AAAA:
case DNS_TYPE_SOA:
case DNS_TYPE_MX:
case DNS_TYPE_LOC:
@@ -1380,17 +1378,25 @@ ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
case DNS_TYPE_NSEC3:
return -EINVAL;
case DNS_TYPE_A:
*ret = &rr->a.in_addr;
return sizeof(rr->a.in_addr);
case DNS_TYPE_AAAA:
*ret = &rr->aaaa.in6_addr;
return sizeof(rr->aaaa.in6_addr);
case DNS_TYPE_SSHFP:
*out = rr->sshfp.fingerprint;
*ret = rr->sshfp.fingerprint;
return rr->sshfp.fingerprint_size;
case DNS_TYPE_TLSA:
*out = rr->tlsa.data;
*ret = rr->tlsa.data;
return rr->tlsa.data_size;
case DNS_TYPE_OPENPGPKEY:
default:
*out = rr->generic.data;
*ret = rr->generic.data;
return rr->generic.data_size;
}
}

View File

@@ -335,7 +335,7 @@ int dns_resource_key_match_soa(const DnsResourceKey *key, const DnsResourceKey *
#define DNS_RESOURCE_KEY_STRING_MAX (_DNS_CLASS_STRING_MAX + _DNS_TYPE_STRING_MAX + DNS_HOSTNAME_MAX + 1)
char* dns_resource_key_to_string(const DnsResourceKey *key, char *buf, size_t buf_size);
ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out);
ssize_t dns_resource_record_payload(DnsResourceRecord *rr, const void **ret);
#define DNS_RESOURCE_KEY_TO_STRING(key) \
dns_resource_key_to_string(key, (char[DNS_RESOURCE_KEY_STRING_MAX]) {}, DNS_RESOURCE_KEY_STRING_MAX)