2323int 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+
8399int 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