]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: address: introduce manager_get_address()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 25 Feb 2022 03:59:58 +0000 (12:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 27 Feb 2022 00:36:48 +0000 (09:36 +0900)
And make manager_has_address() return true only when the link which has
the address is ready.

src/network/networkd-address.c
src/network/networkd-address.h

index f9d8e9bb6cfcc71f9fe4f6d08d5dfbc36bd25d90..f883c79a9eee376f7f2bf5a7ef13d641264ceef8 100644 (file)
@@ -602,19 +602,35 @@ int link_get_address(Link *link, int family, const union in_addr_union *address,
         return -ENOENT;
 }
 
-int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready) {
-        Address *a;
+int manager_get_address(Manager *manager, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret) {
         Link *link;
 
         assert(manager);
         assert(IN_SET(family, AF_INET, AF_INET6));
         assert(address);
 
-        HASHMAP_FOREACH(link, manager->links_by_index)
-                if (link_get_address(link, family, address, 0, &a) >= 0)
-                        return check_ready ? address_is_ready(a) : address_exists(a);
+        HASHMAP_FOREACH(link, manager->links_by_index) {
+                if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED))
+                        continue;
 
-        return false;
+                if (link_get_address(link, family, address, prefixlen, ret) >= 0)
+                        return 0;
+        }
+
+        return -ENOENT;
+}
+
+bool manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready) {
+        Address *a;
+
+        assert(manager);
+        assert(IN_SET(family, AF_INET, AF_INET6));
+        assert(address);
+
+        if (manager_get_address(manager, family, address, 0, &a) < 0)
+                return false;
+
+        return check_ready ? address_is_ready(a) : address_exists(a);
 }
 
 const char* format_lifetime(char *buf, size_t l, usec_t lifetime_usec) {
index 0b1f3192a2de92281ea44daacb9897b38f15741d..b116237638bc5895ed84c5080b9d8aa85e7850a4 100644 (file)
@@ -88,7 +88,8 @@ static inline int link_get_ipv4_address(Link *link, const struct in_addr *addres
         assert(address);
         return link_get_address(link, AF_INET, &(union in_addr_union) { .in = *address }, prefixlen, ret);
 }
-int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready);
+int manager_get_address(Manager *manager, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret);
+bool manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready);
 
 void address_cancel_request(Address *address);
 int link_request_address(