1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-02-03 13:47:04 +03:00

sd-netlink: split message_new() into two parts and introduces message_new_full()

This commit is contained in:
Yu Watanabe 2021-08-24 17:41:14 +09:00
parent 699c3708df
commit 1cedca05e4
2 changed files with 46 additions and 24 deletions

View File

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

View File

@ -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) {