From: Lennart Poettering Date: Thu, 5 Jun 2025 10:17:01 +0000 (+0200) Subject: resolvectl: output slightly more data when --raw=payload is used X-Git-Tag: v258-rc1~385^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=141894f53ac02115cfc9821125619dc782c01122;p=thirdparty%2Fsystemd.git 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 --- diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index bb967f8ce53..f2da7464fe1 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -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); diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index 4be6dd0f23c..339f9433d29 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -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; } } diff --git a/src/resolve/resolved-dns-rr.h b/src/resolve/resolved-dns-rr.h index d183d0b80fe..4129cddccd2 100644 --- a/src/resolve/resolved-dns-rr.h +++ b/src/resolve/resolved-dns-rr.h @@ -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)