Skip to content

Commit 1cedca0

Browse files
committed
sd-netlink: split message_new() into two parts and introduces message_new_full()
1 parent 699c370 commit 1cedca0

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

src/libsystemd/sd-netlink/netlink-internal.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,14 @@ struct sd_netlink_message {
126126
sd_netlink_message *next; /* next in a chain of multi-part messages */
127127
};
128128

129-
int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type);
130129
int message_new_empty(sd_netlink *nl, sd_netlink_message **ret);
130+
int message_new_full(
131+
sd_netlink *nl,
132+
uint16_t nlmsg_type,
133+
const NLTypeSystem *type_system,
134+
size_t header_size,
135+
sd_netlink_message **ret);
136+
int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type);
131137
int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret);
132138
uint32_t message_get_serial(sd_netlink_message *m);
133139
void message_seal(sd_netlink_message *m);

src/libsystemd/sd-netlink/netlink-message.c

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
int message_new_empty(sd_netlink *nl, sd_netlink_message **ret) {
2424
sd_netlink_message *m;
2525

26-
assert_return(ret, -EINVAL);
26+
assert(nl);
27+
assert(ret);
2728

2829
/* Note that 'nl' is currently unused, if we start using it internally we must take care to
2930
* 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) {
3940
};
4041

4142
*ret = m;
42-
4343
return 0;
4444
}
4545

46-
int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type) {
46+
int message_new_full(
47+
sd_netlink *nl,
48+
uint16_t nlmsg_type,
49+
const NLTypeSystem *type_system,
50+
size_t header_size,
51+
sd_netlink_message **ret) {
52+
4753
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
48-
const NLType *nl_type;
4954
size_t size;
5055
int r;
5156

52-
assert_return(nl, -EINVAL);
53-
54-
r = type_system_root_get_type(nl, &nl_type, type);
55-
if (r < 0)
56-
return r;
57+
assert(nl);
58+
assert(type_system);
59+
assert(ret);
5760

58-
if (type_get_type(nl_type) != NETLINK_TYPE_NESTED)
59-
return -EINVAL;
61+
size = NLMSG_SPACE(header_size);
62+
assert(size >= sizeof(struct nlmsghdr));
6063

6164
r = message_new_empty(nl, &m);
6265
if (r < 0)
6366
return r;
6467

65-
size = NLMSG_SPACE(type_get_size(nl_type));
68+
m->containers[0].type_system = type_system;
6669

67-
assert(size >= sizeof(struct nlmsghdr));
6870
m->hdr = malloc0(size);
6971
if (!m->hdr)
7072
return -ENOMEM;
7173

7274
m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
73-
74-
m->containers[0].type_system = type_get_type_system(nl_type);
7575
m->hdr->nlmsg_len = size;
76-
m->hdr->nlmsg_type = type;
76+
m->hdr->nlmsg_type = nlmsg_type;
7777

7878
*ret = TAKE_PTR(m);
79-
8079
return 0;
8180
}
8281

82+
int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type) {
83+
const NLType *nl_type;
84+
int r;
85+
86+
assert_return(nl, -EINVAL);
87+
assert_return(ret, -EINVAL);
88+
89+
r = type_system_root_get_type(nl, &nl_type, type);
90+
if (r < 0)
91+
return r;
92+
93+
if (type_get_type(nl_type) != NETLINK_TYPE_NESTED)
94+
return -EINVAL;
95+
96+
return message_new_full(nl, type, type_get_type_system(nl_type), type_get_size(nl_type), ret);
97+
}
98+
8399
int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret) {
84100
struct nlmsgerr *err;
85101
int r;

0 commit comments

Comments
 (0)