X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-rr.c;h=bc0cbef92e8bfc34521920a8e861816acf277dfc;hp=04004de5e7f9cc5a2f89e3a79acc631344821d1a;hb=ff3d6560bead6879a2fed1bf99bfe8273b3723f1;hpb=42cc2eebb01056beb7acd3ecfe8e533558237f84 diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index 04004de5e..bc0cbef92 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -25,6 +25,8 @@ #include "resolved-dns-domain.h" #include "resolved-dns-rr.h" +#include "resolved-dns-packet.h" +#include "dns-type.h" DnsResourceKey* dns_resource_key_new(uint16_t class, uint16_t type, const char *name) { DnsResourceKey *k; @@ -180,8 +182,7 @@ int dns_resource_key_to_string(const DnsResourceKey *key, char **ret) { t = tbuf; } - s = strjoin(DNS_RESOURCE_KEY_NAME(key), " ", c, " ", t, NULL); - if (!s) + if (asprintf(&s, "%s %s %-5s", DNS_RESOURCE_KEY_NAME(key), c, t) < 0) return -ENOMEM; *ret = s; @@ -269,6 +270,10 @@ DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr) { free(rr->sshfp.key); break; + case DNS_TYPE_DNSKEY: + free(rr->dnskey.key); + break; + case DNS_TYPE_LOC: case DNS_TYPE_A: case DNS_TYPE_AAAA: @@ -330,7 +335,10 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor if (r <= 0) return r; - switch (a->key->type) { + if (a->unparseable != b->unparseable) + return 0; + + switch (a->unparseable ? _DNS_TYPE_INVALID : a->key->type) { case DNS_TYPE_SRV: r = dns_name_equal(a->srv.name, b->srv.name); @@ -403,6 +411,13 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor a->sshfp.key_size == b->sshfp.key_size && memcmp(a->sshfp.key, b->sshfp.key, a->sshfp.key_size) == 0; + case DNS_TYPE_DNSKEY: + return a->dnskey.zone_key_flag == b->dnskey.zone_key_flag && + a->dnskey.sep_flag == b->dnskey.sep_flag && + a->dnskey.algorithm == b->dnskey.algorithm && + a->dnskey.key_size == b->dnskey.key_size && + memcmp(a->dnskey.key, b->dnskey.key, a->dnskey.key_size) == 0; + default: return a->generic.size == b->generic.size && memcmp(a->generic.data, b->generic.data, a->generic.size) == 0; @@ -441,7 +456,7 @@ static char* format_location(uint32_t latitude, uint32_t longitude, uint32_t alt } int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) { - _cleanup_free_ char *k = NULL; + _cleanup_free_ char *k = NULL, *t = NULL; char *s; int r; @@ -481,9 +496,7 @@ int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) { break; case DNS_TYPE_SPF: /* exactly the same as TXT */ - case DNS_TYPE_TXT: { - _cleanup_free_ char *t; - + case DNS_TYPE_TXT: t = strv_join_quoted(rr->txt.strings); if (!t) return -ENOMEM; @@ -493,7 +506,6 @@ int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) { return -ENOMEM; break; - } case DNS_TYPE_A: { _cleanup_free_ char *x = NULL; @@ -508,18 +520,15 @@ int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) { break; } - case DNS_TYPE_AAAA: { - _cleanup_free_ char *x = NULL; - - r = in_addr_to_string(AF_INET6, (const union in_addr_union*) &rr->aaaa.in6_addr, &x); + case DNS_TYPE_AAAA: + r = in_addr_to_string(AF_INET6, (const union in_addr_union*) &rr->aaaa.in6_addr, &t); if (r < 0) return r; - s = strjoin(k, " ", x, NULL); + s = strjoin(k, " ", t, NULL); if (!s) return -ENOMEM; break; - } case DNS_TYPE_SOA: r = asprintf(&s, "%s %s %s %u %u %u %u %u", @@ -544,55 +553,67 @@ int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) { return -ENOMEM; break; - case DNS_TYPE_LOC: { - _cleanup_free_ char *loc; + case DNS_TYPE_LOC: assert(rr->loc.version == 0); - loc = format_location(rr->loc.latitude, - rr->loc.longitude, - rr->loc.altitude, - rr->loc.size, - rr->loc.horiz_pre, - rr->loc.vert_pre); - if (!loc) + t = format_location(rr->loc.latitude, + rr->loc.longitude, + rr->loc.altitude, + rr->loc.size, + rr->loc.horiz_pre, + rr->loc.vert_pre); + if (!t) return -ENOMEM; - s = strjoin(k, " ", loc, NULL); + s = strjoin(k, " ", t, NULL); if (!s) return -ENOMEM; - break; - } - case DNS_TYPE_SSHFP: { - _cleanup_free_ char *x = NULL; - - x = hexmem(rr->sshfp.key, rr->sshfp.key_size); - if (!x) + case DNS_TYPE_SSHFP: + t = hexmem(rr->sshfp.key, rr->sshfp.key_size); + if (!t) return -ENOMEM; r = asprintf(&s, "%s %u %u %s", k, rr->sshfp.algorithm, rr->sshfp.fptype, - x); + t); if (r < 0) return -ENOMEM; break; - } - default: { - _cleanup_free_ char *x = NULL; + case DNS_TYPE_DNSKEY: { + const char *alg; + + alg = dnssec_algorithm_to_string(rr->dnskey.algorithm); - x = hexmem(rr->generic.data, rr->generic.size); - if (!x) + t = hexmem(rr->dnskey.key, rr->dnskey.key_size); + if (!t) return -ENOMEM; - s = strjoin(k, " ", x, NULL); + r = asprintf(&s, "%s %u 3 %.*s%.*u %s", + k, + dnskey_to_flags(rr), + alg ? -1 : 0, alg, + alg ? 0 : 1, alg ? 0u : (unsigned) rr->dnskey.algorithm, + t); + if (r < 0) + return -ENOMEM; + break; + } + + default: + t = hexmem(rr->generic.data, rr->generic.size); + if (!t) + return -ENOMEM; + + s = strjoin(k, " ", t, NULL); if (!s) return -ENOMEM; break; - }} + } *ret = s; return 0; @@ -625,54 +646,3 @@ int dns_class_from_string(const char *s, uint16_t *class) { return 0; } - -static const struct { - uint16_t type; - const char *name; -} dns_types[] = { - { DNS_TYPE_A, "A" }, - { DNS_TYPE_NS, "NS" }, - { DNS_TYPE_CNAME, "CNAME" }, - { DNS_TYPE_SOA, "SOA" }, - { DNS_TYPE_PTR, "PTR" }, - { DNS_TYPE_HINFO, "HINFO" }, - { DNS_TYPE_MX, "MX" }, - { DNS_TYPE_TXT, "TXT" }, - { DNS_TYPE_AAAA, "AAAA" }, - { DNS_TYPE_LOC, "LOC" }, - { DNS_TYPE_SRV, "SRV" }, - { DNS_TYPE_SSHFP, "SSHFP" }, - { DNS_TYPE_SPF, "SPF" }, - { DNS_TYPE_DNAME, "DNAME" }, - { DNS_TYPE_ANY, "ANY" }, - { DNS_TYPE_OPT, "OPT" }, - { DNS_TYPE_TKEY, "TKEY" }, - { DNS_TYPE_TSIG, "TSIG" }, - { DNS_TYPE_IXFR, "IXFR" }, - { DNS_TYPE_AXFR, "AXFR" }, -}; - -const char *dns_type_to_string(uint16_t type) { - unsigned i; - - for (i = 0; i < ELEMENTSOF(dns_types); i++) - if (dns_types[i].type == type) - return dns_types[i].name; - - return NULL; -} - -int dns_type_from_string(const char *s, uint16_t *type) { - unsigned i; - - assert(s); - assert(type); - - for (i = 0; i < ELEMENTSOF(dns_types); i++) - if (strcaseeq(dns_types[i].name, s)) { - *type = dns_types[i].type; - return 0; - } - - return -EINVAL; -}