static void test_dns_name_normalize_one(const char *what, const char *expect, int ret) { _cleanup_free_ char *t = NULL; int r; r = dns_name_normalize(what, &t); assert_se(r == ret); if (r < 0) return; assert_se(streq_ptr(expect, t)); }
static int bus_method_resolve_hostname(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; Manager *m = userdata; const char *hostname; int family, ifindex; uint64_t flags; DnsQuery *q; int r; assert(bus); assert(message); assert(m); r = sd_bus_message_read(message, "isit", &ifindex, &hostname, &family, &flags); if (r < 0) return r; if (!IN_SET(family, AF_INET, AF_INET6, AF_UNSPEC)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown address family %i", family); r = dns_name_normalize(hostname, NULL); if (r < 0) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid hostname '%s'", hostname); r = check_ifindex_flags(ifindex, &flags, error); if (r < 0) return r; question = dns_question_new(family == AF_UNSPEC ? 2 : 1); if (!question) return -ENOMEM; if (family != AF_INET6) { _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, hostname); if (!key) return -ENOMEM; r = dns_question_add(question, key); if (r < 0) return r; } if (family != AF_INET) { _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, hostname); if (!key) return -ENOMEM; r = dns_question_add(question, key); if (r < 0) return r; } r = dns_query_new(m, &q, question, ifindex, flags); if (r < 0) return r; q->request = sd_bus_message_ref(message); q->request_family = family; q->request_hostname = hostname; q->complete = bus_method_resolve_hostname_complete; r = dns_query_bus_track(q, bus, message); if (r < 0) return r; r = dns_query_go(q); if (r < 0) { dns_query_free(q); if (r == -ESRCH) sd_bus_error_setf(error, BUS_ERROR_NO_NAME_SERVERS, "No appropriate name servers or networks for name found"); return r; } return 1; }