int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) { union in_addr_union address; int family, r, ifindex = 0; DnsServer *s; assert(m); assert(word); r = in_addr_ifindex_from_string_auto(word, &family, &address, &ifindex); if (r < 0) return r; /* Filter out duplicates */ s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, ifindex); if (s) { /* * Drop the marker. This is used to find the servers * that ceased to exist, see * manager_mark_dns_servers() and * manager_flush_marked_dns_servers(). */ dns_server_move_back_and_unmark(s); return 0; } return dns_server_new(m, NULL, type, NULL, family, &address, ifindex); }
static int link_update_dns_servers(Link *l) { _cleanup_strv_free_ char **nameservers = NULL; char **nameserver; int r; assert(l); r = sd_network_link_get_dns(l->ifindex, &nameservers); if (r == -ENODATA) { r = 0; goto clear; } if (r < 0) goto clear; dns_server_mark_all(l->dns_servers); STRV_FOREACH(nameserver, nameservers) { union in_addr_union a; DnsServer *s; int family; r = in_addr_from_string_auto(*nameserver, &family, &a); if (r < 0) goto clear; s = dns_server_find(l->dns_servers, family, &a); if (s) dns_server_move_back_and_unmark(s); else { r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a); if (r < 0) goto clear; } } dns_server_unlink_marked(l->dns_servers); return 0; clear: dns_server_unlink_all(l->dns_servers); return r; }
static int link_update_dns_server_one(Link *l, const char *name) { union in_addr_union a; DnsServer *s; int family, r; assert(l); assert(name); r = in_addr_from_string_auto(name, &family, &a); if (r < 0) return r; s = dns_server_find(l->dns_servers, family, &a, 0); if (s) { dns_server_move_back_and_unmark(s); return 0; } return dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a, 0); }