From 1cedca05e4fadeef0bb88fb58cf9a989ab8e6af2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 24 Aug 2021 17:41:14 +0900 Subject: [PATCH] sd-netlink: split message_new() into two parts and introduces message_new_full() --- src/libsystemd/sd-netlink/netlink-internal.h | 8 ++- src/libsystemd/sd-netlink/netlink-message.c | 62 ++++++++++++-------- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-internal.h b/src/libsystemd/sd-netlink/netlink-internal.h index d85b4a0774..e19b460bcd 100644 --- a/src/libsystemd/sd-netlink/netlink-internal.h +++ b/src/libsystemd/sd-netlink/netlink-internal.h @@ -126,8 +126,14 @@ struct sd_netlink_message { sd_netlink_message *next; /* next in a chain of multi-part messages */ }; -int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type); int message_new_empty(sd_netlink *nl, sd_netlink_message **ret); +int message_new_full( + sd_netlink *nl, + uint16_t nlmsg_type, + const NLTypeSystem *type_system, + size_t header_size, + sd_netlink_message **ret); +int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type); int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret); uint32_t message_get_serial(sd_netlink_message *m); void message_seal(sd_netlink_message *m); diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index fe4c2950c1..325c570b2e 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -23,7 +23,8 @@ int message_new_empty(sd_netlink *nl, sd_netlink_message **ret) { sd_netlink_message *m; - assert_return(ret, -EINVAL); + assert(nl); + assert(ret); /* Note that 'nl' is currently unused, if we start using it internally we must take care to * avoid problems due to mutual references between buses and their queued messages. See sd-bus. */ @@ -39,17 +40,51 @@ int message_new_empty(sd_netlink *nl, sd_netlink_message **ret) { }; *ret = m; + return 0; +} +int message_new_full( + sd_netlink *nl, + uint16_t nlmsg_type, + const NLTypeSystem *type_system, + size_t header_size, + sd_netlink_message **ret) { + + _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; + size_t size; + int r; + + assert(nl); + assert(type_system); + assert(ret); + + size = NLMSG_SPACE(header_size); + assert(size >= sizeof(struct nlmsghdr)); + + r = message_new_empty(nl, &m); + if (r < 0) + return r; + + m->containers[0].type_system = type_system; + + m->hdr = malloc0(size); + if (!m->hdr) + return -ENOMEM; + + m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + m->hdr->nlmsg_len = size; + m->hdr->nlmsg_type = nlmsg_type; + + *ret = TAKE_PTR(m); return 0; } int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type) { - _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; const NLType *nl_type; - size_t size; int r; assert_return(nl, -EINVAL); + assert_return(ret, -EINVAL); r = type_system_root_get_type(nl, &nl_type, type); if (r < 0) @@ -58,26 +93,7 @@ int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type) { if (type_get_type(nl_type) != NETLINK_TYPE_NESTED) return -EINVAL; - r = message_new_empty(nl, &m); - if (r < 0) - return r; - - size = NLMSG_SPACE(type_get_size(nl_type)); - - assert(size >= sizeof(struct nlmsghdr)); - m->hdr = malloc0(size); - if (!m->hdr) - return -ENOMEM; - - m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; - - m->containers[0].type_system = type_get_type_system(nl_type); - m->hdr->nlmsg_len = size; - m->hdr->nlmsg_type = type; - - *ret = TAKE_PTR(m); - - return 0; + return message_new_full(nl, type, type_get_type_system(nl_type), type_get_size(nl_type), ret); } int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret) {