X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-answer.c;h=7c4ab18b5835f97ce8210976340d4365e9441268;hp=93e51fc2488662b9ddb471b3f3583732029caf8f;hb=59aa582137cab11ff6aeb9adc56b9e70c4d320ae;hpb=af93291cc4cbd2fe2fb4af7d3c56138fb39f31dc diff --git a/src/resolve/resolved-dns-answer.c b/src/resolve/resolved-dns-answer.c index 93e51fc24..7c4ab18b5 100644 --- a/src/resolve/resolved-dns-answer.c +++ b/src/resolve/resolved-dns-answer.c @@ -97,6 +97,32 @@ int dns_answer_add(DnsAnswer *a, DnsResourceRecord *rr) { return 1; } +int dns_answer_add_soa(DnsAnswer *a, const char *name, uint32_t ttl) { + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *soa = NULL; + + soa = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_SOA, name); + if (!soa) + return -ENOMEM; + + soa->ttl = ttl; + + soa->soa.mname = strdup(name); + if (!soa->soa.mname) + return -ENOMEM; + + soa->soa.rname = strappend("root.", name); + if (!soa->soa.rname) + return -ENOMEM; + + soa->soa.serial = 1; + soa->soa.refresh = 1; + soa->soa.retry = 1; + soa->soa.expire = 1; + soa->soa.minimum = ttl; + + return dns_answer_add(a, soa); +} + int dns_answer_contains(DnsAnswer *a, DnsResourceKey *key) { unsigned i; int r; @@ -122,6 +148,10 @@ int dns_answer_find_soa(DnsAnswer *a, DnsResourceKey *key, DnsResourceRecord **r assert(key); assert(ret); + /* For a SOA record we can never find a matching SOA record */ + if (key->type == DNS_TYPE_SOA) + return 0; + for (i = 0; i < a->n_rrs; i++) { if (a->rrs[i]->key->class != DNS_CLASS_IN)