From: Yu Watanabe Date: Sun, 19 Apr 2026 05:46:59 +0000 (+0900) Subject: dhcp-message: introduce dhcp_message_{append,get}_option_address() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4b2ff0a00f1aa9ac491d6e73dce6d59af7261f4f;p=thirdparty%2Fsystemd.git dhcp-message: introduce dhcp_message_{append,get}_option_address() These are equivalent to dhcp_message_{append,get}_option_be32(), but for type safety. These are for e.g. DHCP options 50 (requested IP address). --- diff --git a/src/libsystemd-network/dhcp-message.c b/src/libsystemd-network/dhcp-message.c index 85976ec6ed1..6344a7a41aa 100644 --- a/src/libsystemd-network/dhcp-message.c +++ b/src/libsystemd-network/dhcp-message.c @@ -167,6 +167,12 @@ int dhcp_message_append_option_sec(sd_dhcp_message *message, uint8_t code, usec_ return dhcp_message_append_option_be32(message, code, usec_to_be32_sec(usec)); } +int dhcp_message_append_option_address(sd_dhcp_message *message, uint8_t code, const struct in_addr *addr) { + assert(message); + assert(addr); + return dhcp_message_append_option_be32(message, code, addr->s_addr); +} + int dhcp_message_get_option(sd_dhcp_message *message, uint8_t code, size_t length, void *ret) { int r; @@ -232,6 +238,11 @@ int dhcp_message_get_option_sec(sd_dhcp_message *message, uint8_t code, bool max return 0; } +int dhcp_message_get_option_address(sd_dhcp_message *message, uint8_t code, struct in_addr *ret) { + assert(message); + return dhcp_message_get_option_be32(message, code, ret ? &ret->s_addr : NULL); +} + static int dhcp_message_verify_header( const struct iovec *iov, uint8_t op, diff --git a/src/libsystemd-network/dhcp-message.h b/src/libsystemd-network/dhcp-message.h index 6086cda3c58..e0e5d875883 100644 --- a/src/libsystemd-network/dhcp-message.h +++ b/src/libsystemd-network/dhcp-message.h @@ -35,6 +35,7 @@ int dhcp_message_append_option_u8(sd_dhcp_message *message, uint8_t code, uint8_ int dhcp_message_append_option_u16(sd_dhcp_message *message, uint8_t code, uint16_t data); int dhcp_message_append_option_be32(sd_dhcp_message *message, uint8_t code, be32_t data); int dhcp_message_append_option_sec(sd_dhcp_message *message, uint8_t code, usec_t usec); +int dhcp_message_append_option_address(sd_dhcp_message *message, uint8_t code, const struct in_addr *addr); int dhcp_message_get_option(sd_dhcp_message *message, uint8_t code, size_t length, void *ret); int dhcp_message_get_option_alloc(sd_dhcp_message *message, uint8_t code, struct iovec *ret); @@ -43,6 +44,7 @@ int dhcp_message_get_option_u8(sd_dhcp_message *message, uint8_t code, uint8_t * int dhcp_message_get_option_u16(sd_dhcp_message *message, uint8_t code, uint16_t *ret); int dhcp_message_get_option_be32(sd_dhcp_message *message, uint8_t code, be32_t *ret); int dhcp_message_get_option_sec(sd_dhcp_message *message, uint8_t code, bool max_as_infinity, usec_t *ret); +int dhcp_message_get_option_address(sd_dhcp_message *message, uint8_t code, struct in_addr *ret); int dhcp_message_parse( const struct iovec *iov, diff --git a/src/libsystemd-network/test-dhcp-message.c b/src/libsystemd-network/test-dhcp-message.c index 3ac8a66d21e..92d22d4de1c 100644 --- a/src/libsystemd-network/test-dhcp-message.c +++ b/src/libsystemd-network/test-dhcp-message.c @@ -58,6 +58,8 @@ static void verify_address(sd_dhcp_message *m, const struct in_addr *expected) { struct in_addr a; ASSERT_OK(dhcp_message_get_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &a.s_addr)); ASSERT_EQ(a.s_addr, expected->s_addr); + ASSERT_OK(dhcp_message_get_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &a)); + ASSERT_EQ(a.s_addr, expected->s_addr); } TEST(dhcp_message) { @@ -117,6 +119,9 @@ TEST(dhcp_message) { /* address */ ASSERT_OK(dhcp_message_append_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, addr.s_addr)); ASSERT_ERROR(dhcp_message_append_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, addr.s_addr), EEXIST); + ASSERT_ERROR(dhcp_message_append_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &addr), EEXIST); + dhcp_message_remove_option(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS); + ASSERT_OK(dhcp_message_append_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &addr)); verify_address(m, &addr); /* build and parse */