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);
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;
}
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;
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;
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);