]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce address_dup() and replace address_copy() with it
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 21 Jun 2021 07:42:22 +0000 (16:42 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 30 Jun 2021 15:49:02 +0000 (00:49 +0900)
src/network/networkd-address.c
src/network/networkd-address.h

index 2b0967d914fd7212e6e9091382b2ca433b308aff..3a701b7dc9d5166a51672b11d8269d0cb2a0f340 100644 (file)
@@ -301,11 +301,23 @@ bool address_equal(const Address *a1, const Address *a2) {
         return address_compare_func(a1, a2) == 0;
 }
 
-static int address_copy(Address *dest, const Address *src) {
+int address_dup(const Address *src, Address **ret) {
+        _cleanup_(address_freep) Address *dest = NULL;
         int r;
 
-        assert(dest);
         assert(src);
+        assert(ret);
+
+        dest = newdup(Address, src, 1);
+        if (!dest)
+                return -ENOMEM;
+
+        /* clear all pointers */
+        dest->network = NULL;
+        dest->section = NULL;
+        dest->link = NULL;
+        dest->label = NULL;
+        dest->acd = NULL;
 
         if (src->family == AF_INET) {
                 r = free_and_strdup(&dest->label, src->label);
@@ -313,17 +325,7 @@ static int address_copy(Address *dest, const Address *src) {
                         return r;
         }
 
-        dest->family = src->family;
-        dest->prefixlen = src->prefixlen;
-        dest->scope = src->scope;
-        dest->flags = src->flags;
-        dest->cinfo = src->cinfo;
-        dest->in_addr = src->in_addr;
-        dest->in_addr_peer = src->in_addr_peer;
-        if (address_may_have_broadcast(src))
-                dest->broadcast = src->broadcast;
-        dest->duplicate_address_detection = src->duplicate_address_detection;
-
+        *ret = TAKE_PTR(dest);
         return 0;
 }
 
@@ -373,11 +375,7 @@ static int address_add_internal(Link *link, Set **addresses, const Address *in,
         assert(addresses);
         assert(in);
 
-        r = address_new(&address);
-        if (r < 0)
-                return r;
-
-        r = address_copy(address, in);
+        r = address_dup(in, &address);
         if (r < 0)
                 return r;
 
@@ -955,11 +953,7 @@ static int address_acquire(Link *link, const Address *original, Address **ret) {
         else if (original->family == AF_INET6)
                 in_addr.in6.s6_addr[15] |= 1;
 
-        r = address_new(&na);
-        if (r < 0)
-                return r;
-
-        r = address_copy(na, original);
+        r = address_dup(original, &na);
         if (r < 0)
                 return r;
 
index 56251089d1ae8a6ca61abe1ff7f84d8ef78d0ad0..9de2fae2df4b85d0e94562264680891b88a3a59d 100644 (file)
@@ -55,6 +55,7 @@ int address_get(Link *link, const Address *in, Address **ret);
 int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg);
 int address_remove(const Address *address, Link *link);
 bool address_equal(const Address *a1, const Address *a2);
+int address_dup(const Address *src, Address **ret);
 bool address_is_ready(const Address *a);
 void address_set_broadcast(Address *a);