From: Yu Watanabe Date: Mon, 21 Jun 2021 07:42:22 +0000 (+0900) Subject: network: introduce address_dup() and replace address_copy() with it X-Git-Tag: v249-rc3~17^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99b466693e10863655150bef52a9ed493cdfbe54;p=thirdparty%2Fsystemd.git network: introduce address_dup() and replace address_copy() with it --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 2b0967d914f..3a701b7dc9d 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 56251089d1a..9de2fae2df4 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -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);