]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: add a read function
authorFlorian Westphal <fw@strlen.de>
Thu, 3 Sep 2020 23:04:51 +0000 (01:04 +0200)
committerFlorian Westphal <fw@strlen.de>
Tue, 15 Dec 2020 23:35:56 +0000 (00:35 +0100)
Will be used by nftables nfnetlink backend.
It sends a series of netlink messages that form a nftables
update transaction.

The transaction will then generate a series of ack messages
(or an error).

This function will be used to read these acks.

src/libsystemd/sd-netlink/sd-netlink.c
src/systemd/sd-netlink.h

index 5a8b4d932223701aa6d827a4ae170ebe842a9846..ceb8333cbe3960d2b3c7e6b41d5eb1aa8d5d7600 100644 (file)
@@ -621,21 +621,15 @@ int sd_netlink_call_async(
         return k;
 }
 
-int sd_netlink_call(sd_netlink *rtnl,
-                sd_netlink_message *message,
-                uint64_t usec,
-                sd_netlink_message **ret) {
+int sd_netlink_read(sd_netlink *rtnl,
+                    uint32_t serial,
+                    uint64_t usec,
+                    sd_netlink_message **ret) {
         usec_t timeout;
-        uint32_t serial;
         int r;
 
         assert_return(rtnl, -EINVAL);
         assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
-        assert_return(message, -EINVAL);
-
-        r = sd_netlink_send(rtnl, message, &serial);
-        if (r < 0)
-                return r;
 
         timeout = calc_elapse(usec);
 
@@ -705,6 +699,24 @@ int sd_netlink_call(sd_netlink *rtnl,
         }
 }
 
+int sd_netlink_call(sd_netlink *rtnl,
+                sd_netlink_message *message,
+                uint64_t usec,
+                sd_netlink_message **ret) {
+        uint32_t serial;
+        int r;
+
+        assert_return(rtnl, -EINVAL);
+        assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
+        assert_return(message, -EINVAL);
+
+        r = sd_netlink_send(rtnl, message, &serial);
+        if (r < 0)
+                return r;
+
+        return sd_netlink_read(rtnl, serial, usec, ret);
+}
+
 int sd_netlink_get_events(const sd_netlink *rtnl) {
         assert_return(rtnl, -EINVAL);
         assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
index 2b52c4ca88870423c217c8fe52ad3acf4f0748d1..41a7d89b60e70e7d912c28e375ad1890a86166d8 100644 (file)
@@ -66,6 +66,7 @@ int sd_netlink_call_async(sd_netlink *nl, sd_netlink_slot **ret_slot, sd_netlink
                           void *userdata, uint64_t usec, const char *description);
 int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeout,
                     sd_netlink_message **reply);
+int sd_netlink_read(sd_netlink *nl, uint32_t serial, uint64_t timeout, sd_netlink_message **reply);
 
 int sd_netlink_get_events(const sd_netlink *nl);
 int sd_netlink_get_timeout(const sd_netlink *nl, uint64_t *timeout);