sd-netlink: introduce sd_genl_message_get_command()

This commit is contained in:
Yu Watanabe
2021-08-29 18:10:47 +09:00
parent 44f1072a9d
commit ef90beb1c5
3 changed files with 42 additions and 0 deletions
+38
View File
@@ -60,6 +60,7 @@ static int genl_family_new(
_cleanup_(genl_family_freep) GenericNetlinkFamily *f = NULL;
const char *family_name;
uint8_t cmd;
int r;
assert(nl);
@@ -105,6 +106,13 @@ static int genl_family_new(
if (!streq(family_name, CTRL_GENL_NAME))
return -EINVAL;
r = sd_genl_message_get_command(nl, message, &cmd);
if (r < 0)
return r;
if (cmd != CTRL_CMD_NEWFAMILY)
return -EINVAL;
r = sd_netlink_message_read_u16(message, CTRL_ATTR_FAMILY_ID, &f->id);
if (r < 0)
return r;
@@ -335,6 +343,36 @@ int sd_genl_message_get_family_name(sd_netlink *nl, sd_netlink_message *m, const
return 0;
}
int sd_genl_message_get_command(sd_netlink *nl, sd_netlink_message *m, uint8_t *ret) {
struct genlmsghdr *h;
uint16_t nlmsg_type;
size_t size;
int r;
assert_return(nl, -EINVAL);
assert_return(nl->protocol == NETLINK_GENERIC, -EINVAL);
assert_return(m, -EINVAL);
assert_return(m->protocol == NETLINK_GENERIC, -EINVAL);
assert_return(m->hdr, -EINVAL);
assert_return(ret, -EINVAL);
r = sd_netlink_message_get_type(m, &nlmsg_type);
if (r < 0)
return r;
r = genl_get_type_system_and_header_size(nl, nlmsg_type, NULL, &size);
if (r < 0)
return r;
if (m->hdr->nlmsg_len < NLMSG_LENGTH(size))
return -EBADMSG;
h = NLMSG_DATA(m->hdr);
*ret = h->cmd;
return 0;
}
int sd_genl_socket_open(sd_netlink **ret) {
return netlink_open_family(ret, NETLINK_GENERIC);
}
+3
View File
@@ -587,6 +587,7 @@ static void test_genl(void) {
_cleanup_(sd_netlink_unrefp) sd_netlink *genl = NULL;
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
const char *name;
uint8_t cmd;
log_debug("/* %s */", __func__);
@@ -594,6 +595,8 @@ static void test_genl(void) {
assert_se(sd_genl_message_new(genl, CTRL_GENL_NAME, CTRL_CMD_GETFAMILY, &m) >= 0);
assert_se(sd_genl_message_get_family_name(genl, m, &name) >= 0);
assert_se(streq(name, CTRL_GENL_NAME));
assert_se(sd_genl_message_get_command(genl, m, &cmd) >= 0);
assert_se(cmd == CTRL_CMD_GETFAMILY);
m = sd_netlink_message_unref(m);
assert_se(sd_genl_message_new(genl, "should-not-exist", CTRL_CMD_GETFAMILY, &m) < 0);
+1
View File
@@ -237,6 +237,7 @@ int sd_nfnl_nft_message_add_setelem_end(sd_netlink_message *m);
int sd_genl_socket_open(sd_netlink **ret);
int sd_genl_message_new(sd_netlink *genl, const char *family_name, uint8_t cmd, sd_netlink_message **ret);
int sd_genl_message_get_family_name(sd_netlink *genl, sd_netlink_message *m, const char **ret);
int sd_genl_message_get_command(sd_netlink *genl, sd_netlink_message *m, uint8_t *ret);
/* slot */
sd_netlink_slot *sd_netlink_slot_ref(sd_netlink_slot *slot);