]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolvectl: output slightly more data when --raw=payload is used
authorLennart Poettering <lennart@poettering.net>
Thu, 5 Jun 2025 10:17:01 +0000 (12:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 5 Jun 2025 10:38:28 +0000 (12:38 +0200)
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

src/resolve/resolvectl.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h

index bb967f8ce53e70754c3152c5a44c4eaff98105bd..f2da7464fe1146ad30285bfa12b80add092723cd 100644 (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);
index 4be6dd0f23cf18e063da4af07aa2e5dbf7a8b8a9..339f9433d291524c867aa644e2194cd34b944ca8 100644 (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;
         }
 }
index d183d0b80fe017bd3e69b96d06e3f06c101a84b7..4129cddccd2585b10533c8ea159ebb142a2093ad 100644 (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)