]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: split message_new() into two parts and introduces message_new_full()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 24 Aug 2021 08:41:14 +0000 (17:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 29 Aug 2021 09:01:26 +0000 (18:01 +0900)
src/libsystemd/sd-netlink/netlink-internal.h
src/libsystemd/sd-netlink/netlink-message.c

index d85b4a077472acff82b6dcba896d41511c4f994c..e19b460bcd9ca199a9596e68488e67264e669fb4 100644 (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);
index fe4c2950c10c876f8a95d20d94f0083557dcd93b..325c570b2edbed42fe85ad61d97043d7de74f942 100644 (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,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;