From: Yu Watanabe Date: Mon, 19 Aug 2024 21:56:53 +0000 (+0900) Subject: sd-netlink: introduce sd_netlink_message_read_u64() X-Git-Tag: v257-rc1~669^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7275739728fe6649ed5dd4baacecf38728e04f12;p=thirdparty%2Fsystemd.git sd-netlink: introduce sd_netlink_message_read_u64() --- diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index 49d000d47e3..25bcbd96409 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -928,6 +928,34 @@ int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint3 return 0; } +int sd_netlink_message_read_u64(sd_netlink_message *m, uint16_t attr_type, uint64_t *ret) { + void *attr_data; + bool net_byteorder; + int r; + + assert_return(m, -EINVAL); + + r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_U64); + if (r < 0) + return r; + + r = netlink_message_read_internal(m, attr_type, &attr_data, &net_byteorder); + if (r < 0) + return r; + + if ((size_t) r < sizeof(uint64_t)) + return -EIO; + + if (ret) { + if (net_byteorder) + *ret = be64toh(*(uint64_t *) attr_data); + else + *ret = *(uint64_t *) attr_data; + } + + return 0; +} + int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *data) { void *attr_data; int r; diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h index 34db2bbf1cc..b0917255107 100644 --- a/src/systemd/sd-netlink.h +++ b/src/systemd/sd-netlink.h @@ -112,6 +112,7 @@ int sd_netlink_message_read_strv(sd_netlink_message *m, uint16_t container_type, int sd_netlink_message_read_u8(sd_netlink_message *m, uint16_t attr_type, uint8_t *data); int sd_netlink_message_read_u16(sd_netlink_message *m, uint16_t attr_type, uint16_t *data); int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint32_t *data); +int sd_netlink_message_read_u64(sd_netlink_message *m, uint16_t attr_type, uint64_t *ret); int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *data); int sd_netlink_message_read_cache_info(sd_netlink_message *m, uint16_t attr_type, struct ifa_cacheinfo *info); int sd_netlink_message_read_in_addr(sd_netlink_message *m, uint16_t attr_type, struct in_addr *data);