X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-rr.c;h=8b8858848c15543619514fff88551b3e952a57d9;hb=02dd6e189a6d2b7f3884ad4cdb3d8c85e009c565;hp=c9b564b544135952c06e9a88b3e997ac6848c20f;hpb=faa133f3aa7a18f26563dc5d6b95898cb315c37a;p=elogind.git diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index c9b564b54..8b8858848 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -172,6 +172,16 @@ DnsResourceRecord* dns_resource_record_new(DnsResourceKey *key) { return rr; } +DnsResourceRecord* dns_resource_record_new_full(uint16_t class, uint16_t type, const char *name) { + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + key = dns_resource_key_new(class, type, name); + if (!key) + return NULL; + + return dns_resource_record_new(key); +} + DnsResourceRecord* dns_resource_record_ref(DnsResourceRecord *rr) { if (!rr) return NULL; @@ -199,6 +209,9 @@ DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr) { else if (rr->key->type == DNS_TYPE_HINFO) { free(rr->hinfo.cpu); free(rr->hinfo.os); + } else if (rr->key->type == DNS_TYPE_SOA) { + free(rr->soa.mname); + free(rr->soa.rname); } else if (!IN_SET(rr->key->type, DNS_TYPE_A, DNS_TYPE_AAAA)) free(rr->generic.data); @@ -210,6 +223,40 @@ DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr) { return NULL; } +int dns_resource_record_new_reverse(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *hostname) { + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + _cleanup_free_ char *ptr = NULL; + int r; + + assert(ret); + assert(address); + assert(hostname); + + r = dns_name_reverse(family, address, &ptr); + if (r < 0) + return r; + + key = dns_resource_key_new_consume(DNS_CLASS_IN, DNS_TYPE_PTR, ptr); + if (!key) + return -ENOMEM; + + ptr = NULL; + + rr = dns_resource_record_new(key); + if (!rr) + return -ENOMEM; + + rr->ptr.name = strdup(hostname); + if (!rr->ptr.name) + return -ENOMEM; + + *ret = rr; + rr = NULL; + + return 0; +} + int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b) { int r; @@ -229,7 +276,20 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor return memcmp(&a->a.in_addr, &b->a.in_addr, sizeof(struct in_addr)) == 0; else if (a->key->type == DNS_TYPE_AAAA) return memcmp(&a->aaaa.in6_addr, &b->aaaa.in6_addr, sizeof(struct in6_addr)) == 0; - else + else if (a->key->type == DNS_TYPE_SOA) { + r = dns_name_equal(a->soa.mname, b->soa.mname); + if (r <= 0) + return r; + r = dns_name_equal(a->soa.rname, b->soa.rname); + if (r <= 0) + return r; + + return a->soa.serial == b->soa.serial && + a->soa.refresh == b->soa.refresh && + a->soa.retry == b->soa.retry && + a->soa.expire == b->soa.expire && + a->soa.minimum == b->soa.minimum; + } else return a->generic.size == b->generic.size && memcmp(a->generic.data, b->generic.data, a->generic.size) == 0; }