From: Yu Watanabe Date: Tue, 24 Aug 2021 08:41:14 +0000 (+0900) Subject: sd-netlink: split message_new() into two parts and introduces message_new_full() X-Git-Tag: v250-rc1~763^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1cedca05e4fadeef0bb88fb58cf9a989ab8e6af2;p=thirdparty%2Fsystemd.git sd-netlink: split message_new() into two parts and introduces message_new_full() --- diff --git a/src/libsystemd/sd-netlink/netlink-internal.h b/src/libsystemd/sd-netlink/netlink-internal.h index d85b4a07747..e19b460bcd9 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 fe4c2950c10..325c570b2ed 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,47 +40,62 @@ int message_new_empty(sd_netlink *nl, sd_netlink_message **ret) { }; *ret = m; - return 0; } -int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type) { +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; - const NLType *nl_type; size_t size; int r; - assert_return(nl, -EINVAL); - - r = type_system_root_get_type(nl, &nl_type, type); - if (r < 0) - return r; + assert(nl); + assert(type_system); + assert(ret); - if (type_get_type(nl_type) != NETLINK_TYPE_NESTED) - return -EINVAL; + size = NLMSG_SPACE(header_size); + assert(size >= sizeof(struct nlmsghdr)); r = message_new_empty(nl, &m); if (r < 0) return r; - size = NLMSG_SPACE(type_get_size(nl_type)); + m->containers[0].type_system = type_system; - 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; + 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) { + const NLType *nl_type; + int r; + + assert_return(nl, -EINVAL); + assert_return(ret, -EINVAL); + + r = type_system_root_get_type(nl, &nl_type, type); + if (r < 0) + return r; + + if (type_get_type(nl_type) != NETLINK_TYPE_NESTED) + return -EINVAL; + + 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) { struct nlmsgerr *err; int r;