mirror of
https://github.com/systemd/systemd.git
synced 2025-03-31 14:50:15 +03:00
resolved: rr - introduce dns_resource_key_new_redirect()
Takes a key and CNAME RR and returns the canonical RR of the right type. Make use of this in dns_question_redirect().
This commit is contained in:
parent
7c1ff6ac3d
commit
36d9205d66
@ -191,7 +191,7 @@ static void bus_method_resolve_hostname_complete(DnsQuery *q) {
|
||||
|
||||
/* This has a cname? Then update the query with the
|
||||
* new cname. */
|
||||
r = dns_query_cname_redirect(q, cname->cname.name);
|
||||
r = dns_query_cname_redirect(q, cname);
|
||||
if (r < 0) {
|
||||
if (r == -ELOOP)
|
||||
r = sd_bus_reply_method_errorf(q->request, BUS_ERROR_CNAME_LOOP, "CNAME loop on '%s'", q->request_hostname);
|
||||
|
@ -831,7 +831,7 @@ void dns_query_ready(DnsQuery *q) {
|
||||
dns_query_complete(q, state);
|
||||
}
|
||||
|
||||
int dns_query_cname_redirect(DnsQuery *q, const char *name) {
|
||||
int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname) {
|
||||
_cleanup_(dns_question_unrefp) DnsQuestion *nq = NULL;
|
||||
int r;
|
||||
|
||||
@ -840,7 +840,7 @@ int dns_query_cname_redirect(DnsQuery *q, const char *name) {
|
||||
if (q->n_cname_redirects > CNAME_MAX)
|
||||
return -ELOOP;
|
||||
|
||||
r = dns_question_cname_redirect(q->question, name, &nq);
|
||||
r = dns_question_cname_redirect(q->question, cname, &nq);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -72,7 +72,7 @@ DnsQuery *dns_query_free(DnsQuery *q);
|
||||
int dns_query_go(DnsQuery *q);
|
||||
void dns_query_ready(DnsQuery *q);
|
||||
|
||||
int dns_query_cname_redirect(DnsQuery *q, const char *name);
|
||||
int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname);
|
||||
|
||||
int dns_query_bus_track(DnsQuery *q, sd_bus_message *m);
|
||||
|
||||
|
@ -242,13 +242,13 @@ int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **ret) {
|
||||
int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret) {
|
||||
_cleanup_(dns_question_unrefp) DnsQuestion *n = NULL;
|
||||
bool same = true;
|
||||
unsigned i;
|
||||
int r;
|
||||
|
||||
assert(name);
|
||||
assert(cname);
|
||||
assert(ret);
|
||||
|
||||
if (!q) {
|
||||
@ -262,7 +262,7 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **
|
||||
}
|
||||
|
||||
for (i = 0; i < q->n_keys; i++) {
|
||||
r = dns_name_equal(DNS_RESOURCE_KEY_NAME(q->keys[i]), name);
|
||||
r = dns_name_equal(DNS_RESOURCE_KEY_NAME(q->keys[i]), cname->cname.name);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -286,7 +286,7 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **
|
||||
for (i = 0; i < q->n_keys; i++) {
|
||||
_cleanup_(dns_resource_key_unrefp) DnsResourceKey *k = NULL;
|
||||
|
||||
k = dns_resource_key_new(q->keys[i]->class, q->keys[i]->type, name);
|
||||
k = dns_resource_key_new_redirect(q->keys[i], cname);
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -46,6 +46,6 @@ int dns_question_is_superset(DnsQuestion *q, DnsQuestion *other);
|
||||
int dns_question_contains(DnsQuestion *a, DnsResourceKey *k);
|
||||
int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b);
|
||||
|
||||
int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **ret);
|
||||
int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuestion*, dns_question_unref);
|
||||
|
@ -54,6 +54,13 @@ DnsResourceKey* dns_resource_key_new_cname(const DnsResourceKey *key) {
|
||||
return dns_resource_key_new(key->class, DNS_TYPE_CNAME, DNS_RESOURCE_KEY_NAME(key));
|
||||
}
|
||||
|
||||
DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const DnsResourceRecord *cname) {
|
||||
assert(key);
|
||||
assert(cname);
|
||||
|
||||
return dns_resource_key_new(key->class, key->type, cname->cname.name);
|
||||
}
|
||||
|
||||
DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name) {
|
||||
DnsResourceKey *k;
|
||||
|
||||
|
@ -178,6 +178,7 @@ static inline const char* DNS_RESOURCE_KEY_NAME(const DnsResourceKey *key) {
|
||||
|
||||
DnsResourceKey* dns_resource_key_new(uint16_t class, uint16_t type, const char *name);
|
||||
DnsResourceKey* dns_resource_key_new_cname(const DnsResourceKey *key);
|
||||
DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const DnsResourceRecord *cname);
|
||||
DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name);
|
||||
DnsResourceKey* dns_resource_key_ref(DnsResourceKey *key);
|
||||
DnsResourceKey* dns_resource_key_unref(DnsResourceKey *key);
|
||||
|
Loading…
x
Reference in New Issue
Block a user