diff options
Diffstat (limited to 'src/libsystemd/sd-netlink/netlink-message.c')
-rw-r--r-- | src/libsystemd/sd-netlink/netlink-message.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index 23907c8224..b0b25639f4 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -96,13 +96,7 @@ int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) { return 0; } -sd_netlink_message *sd_netlink_message_ref(sd_netlink_message *m) { - if (!m) - return NULL; - - assert_se(REFCNT_INC(m->n_ref) >= 2); - return m; -} +DEFINE_ATOMIC_REF_FUNC(sd_netlink_message, sd_netlink_message); sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) { sd_netlink_message *t; @@ -568,6 +562,25 @@ static int netlink_message_read_internal(sd_netlink_message *m, unsigned short t return RTA_PAYLOAD(rta); } +int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, size_t size, void *data) { + void *attr_data; + int r; + + assert_return(m, -EINVAL); + + r = netlink_message_read_internal(m, type, &attr_data, NULL); + if (r < 0) + return r; + + if ((size_t) r < size) + return -EIO; + + if (data) + memcpy(data, attr_data, size); + + return 0; +} + int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data) { int r; void *attr_data; @@ -758,7 +771,7 @@ static int netlink_container_parse(sd_netlink_message *m, struct netlink_container *container, int count, struct rtattr *rta, - unsigned int rt_len) { + unsigned rt_len) { _cleanup_free_ struct netlink_attribute *attributes = NULL; attributes = new0(struct netlink_attribute, count); |