From 67b19a496173e0401e9f2b7a3591715e0fe22b75 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 3 Feb 2019 01:06:23 +0100 Subject: [PATCH] sd-netlink: unify sd_netlink_message_append_in{,6}_addr() and _sockaddr_in{,6}() --- src/libsystemd/sd-netlink/netlink-message.c | 51 +++++++-------------- src/libsystemd/sd-netlink/netlink-util.h | 5 ++ 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index 5e9bc45139..f878fc9471 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -334,36 +334,46 @@ int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, c return 0; } -int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { +int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); + assert_return(IN_SET(family, AF_INET, AF_INET6), -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_IN_ADDR); if (r < 0) return r; - r = add_rtattr(m, type, data, sizeof(struct in_addr)); + r = add_rtattr(m, type, data, FAMILY_ADDRESS_SIZE(family)); if (r < 0) return r; return 0; } +int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { + return netlink_message_append_in_addr_union(m, type, AF_INET, (const union in_addr_union *) data); +} + int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data) { + return netlink_message_append_in_addr_union(m, type, AF_INET6, (const union in_addr_union *) data); +} + +int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); + assert_return(IN_SET(data->sa.sa_family, AF_INET, AF_INET6), -EINVAL); - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_IN_ADDR); + r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); if (r < 0) return r; - r = add_rtattr(m, type, data, sizeof(struct in6_addr)); + r = add_rtattr(m, type, data, data->sa.sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)); if (r < 0) return r; @@ -371,41 +381,14 @@ int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short typ } int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data) { - int r; - - assert_return(m, -EINVAL); - assert_return(!m->sealed, -EPERM); - assert_return(data, -EINVAL); - - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); - if (r < 0) - return r; - - r = add_rtattr(m, type, data, sizeof(struct sockaddr_in)); - if (r < 0) - return r; - - return 0; + return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data) { - int r; - - assert_return(m, -EINVAL); - assert_return(!m->sealed, -EPERM); - assert_return(data, -EINVAL); - - r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); - if (r < 0) - return r; - - r = add_rtattr(m, type, data, sizeof(struct sockaddr_in6)); - if (r < 0) - return r; - - return 0; + return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } + int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { int r; diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index d2723285a6..0d01a4bd0e 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -3,6 +3,8 @@ #include "sd-netlink.h" +#include "in-addr-util.h" +#include "socket-util.h" #include "util.h" int rtnl_message_new_synthetic_error(sd_netlink *rtnl, int error, uint32_t serial, sd_netlink_message **ret); @@ -58,3 +60,6 @@ int rtnl_log_create_error(int r); (sd_netlink_destroy_t) _destroy_, \ userdata, __func__); \ }) + +int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data); +int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data);