+static void manager_flush_names(Manager *m) {
+ ServerName *n;
+
+ assert(m);
+
+ while ((n = m->servers)) {
+ LIST_REMOVE(names, m->servers, n);
+ free(n->string);
+ server_name_flush_addresses(n);
+ free(n);
+ }
+}
+
+static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) {
+ Manager *m = userdata;
+ ServerAddress *a, *last = NULL;
+
+ assert(q);
+ assert(m);
+ assert(m->current_server_name);
+
+ m->resolve_query = sd_resolve_query_unref(m->resolve_query);
+
+ if (ret != 0) {
+ log_error("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
+
+ /* Try next host */
+ return manager_connect(m);
+ }
+
+ server_name_flush_addresses(m->current_server_name);
+
+ for (; ai; ai = ai->ai_next) {
+ _cleanup_free_ char *pretty = NULL;
+
+ assert(ai->ai_addr);
+ assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data));
+ assert(ai->ai_addrlen <= sizeof(union sockaddr_union));
+
+ if (!IN_SET(ai->ai_addr->sa_family, AF_INET, AF_INET6)) {
+ log_warning("Unsuitable address protocol for %s", m->current_server_name->string);
+ continue;
+ }
+
+ a = new0(ServerAddress, 1);
+ if (!a)
+ return log_oom();
+
+ memcpy(&a->sockaddr, ai->ai_addr, ai->ai_addrlen);
+ a->socklen = ai->ai_addrlen;
+
+ LIST_INSERT_AFTER(addresses, m->current_server_name->addresses, last, a);
+ last = a;