network: introduce address_dup() and replace address_copy() with it

This commit is contained in:
Yu Watanabe
2021-07-01 00:49:02 +09:00
parent f8d6397ac2
commit 99b466693e
2 changed files with 18 additions and 23 deletions
+17 -23
View 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;
+1
View 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);