]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
netlink: introduce sd_netlink_message_has_flag()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 14 Feb 2021 17:49:55 +0000 (02:49 +0900)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Feb 2021 21:36:24 +0000 (22:36 +0100)
src/libsystemd/sd-netlink/netlink-message.c
src/systemd/sd-netlink.h

index bd56536062eddf9d5bdc51352d7ad480dd4e314c..34c74f99dc1e0af7bb40df7bba36a9ceb125457a 100644 (file)
@@ -663,13 +663,17 @@ int sd_netlink_message_cancel_array(sd_netlink_message *m) {
         return 0;
 }
 
-static int netlink_message_read_internal(sd_netlink_message *m, unsigned short type, void **data, bool *net_byteorder) {
+static int netlink_message_read_internal(
+                sd_netlink_message *m,
+                unsigned short type,
+                void **ret_data,
+                bool *ret_net_byteorder) {
+
         struct netlink_attribute *attribute;
         struct rtattr *rta;
 
         assert_return(m, -EINVAL);
         assert_return(m->sealed, -EPERM);
-        assert_return(data, -EINVAL);
 
         assert(m->n_containers < RTNL_CONTAINER_DEPTH);
 
@@ -686,10 +690,11 @@ static int netlink_message_read_internal(sd_netlink_message *m, unsigned short t
 
         rta = (struct rtattr*)((uint8_t *) m->hdr + attribute->offset);
 
-        *data = RTA_DATA(rta);
+        if (ret_data)
+                *ret_data = RTA_DATA(rta);
 
-        if (net_byteorder)
-                *net_byteorder = attribute->net_byteorder;
+        if (ret_net_byteorder)
+                *ret_net_byteorder = attribute->net_byteorder;
 
         return RTA_PAYLOAD(rta);
 }
@@ -974,6 +979,27 @@ int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type,
         return r;
 }
 
+int sd_netlink_message_has_flag(sd_netlink_message *m, unsigned short type) {
+        void *attr_data;
+        int r;
+
+        assert_return(m, -EINVAL);
+
+        /* This returns 1 when the flag is set, 0 when not set, negative errno on error. */
+
+        r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_FLAG);
+        if (r < 0)
+                return r;
+
+        r = netlink_message_read_internal(m, type, &attr_data, NULL);
+        if (r == -ENODATA)
+                return 0;
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
 int sd_netlink_message_read_strv(sd_netlink_message *m, unsigned short container_type, unsigned short type_id, char ***ret) {
         _cleanup_strv_free_ char **s = NULL;
         const NLTypeSystem *type_system;
index 65d590c5b7927df69d68defff9cebc2f7ab7d684..2987faba7682d446dd95be9331b78baea70321de 100644 (file)
@@ -116,6 +116,7 @@ int sd_netlink_message_read_ether_addr(sd_netlink_message *m, unsigned short typ
 int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info);
 int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, struct in_addr *data);
 int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data);
+int sd_netlink_message_has_flag(sd_netlink_message *m, unsigned short type);
 int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short type);
 int sd_netlink_message_enter_array(sd_netlink_message *m, unsigned short type);
 int sd_netlink_message_exit_container(sd_netlink_message *m);