From: Yu Watanabe Date: Mon, 24 Jul 2023 16:57:10 +0000 (+0900) Subject: sd-dhcp: introduce sd_dhcp_lease_get_prefix() X-Git-Tag: v255-rc1~900^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33acdc511c52c662ba8a42d851d1d8dde0f714f7;p=thirdparty%2Fsystemd.git sd-dhcp: introduce sd_dhcp_lease_get_prefix() --- diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 03fd80064b7..5e8869a3b71 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -201,6 +201,34 @@ int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) { return 0; } +int sd_dhcp_lease_get_prefix(sd_dhcp_lease *lease, struct in_addr *ret_prefix, uint8_t *ret_prefixlen) { + struct in_addr address, netmask; + uint8_t prefixlen; + int r; + + assert_return(lease, -EINVAL); + + r = sd_dhcp_lease_get_address(lease, &address); + if (r < 0) + return r; + + r = sd_dhcp_lease_get_netmask(lease, &netmask); + if (r < 0) + return r; + + prefixlen = in4_addr_netmask_to_prefixlen(&netmask); + + r = in4_addr_mask(&address, prefixlen); + if (r < 0) + return r; + + if (ret_prefix) + *ret_prefix = address; + if (ret_prefixlen) + *ret_prefixlen = prefixlen; + return 0; +} + int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr) { assert_return(lease, -EINVAL); assert_return(addr, -EINVAL); diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index a0e09e52aca..8a270595722 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -52,6 +52,7 @@ int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1); int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2); int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr); int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr); +int sd_dhcp_lease_get_prefix(sd_dhcp_lease *lease, struct in_addr *ret_prefix, uint8_t *ret_prefixlen); int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr); int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr); int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);