From: Lennart Poettering Date: Mon, 13 Oct 2025 09:25:50 +0000 (+0200) Subject: sd-dhcp-server: add api to get address from hostname, based on lease data X-Git-Tag: v259-rc1~43^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4408db690886308d16059d3c8423546f4c29aa75;p=thirdparty%2Fsystemd.git sd-dhcp-server: add api to get address from hostname, based on lease data --- diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c index 75031606436..c86e4e0e0c1 100644 --- a/src/libsystemd-network/sd-dhcp-server.c +++ b/src/libsystemd-network/sd-dhcp-server.c @@ -1711,3 +1711,38 @@ int sd_dhcp_server_set_lease_file(sd_dhcp_server *server, int dir_fd, const char return 0; } + +static int find_lease_address(Hashmap *h, const char *name, struct in_addr *ret) { + int r; + + assert(name); + + sd_dhcp_server_lease *lease; + HASHMAP_FOREACH(lease, h) { + if (!lease->hostname) + continue; + + r = dns_name_equal(lease->hostname, name); + if (r <= 0) + continue; + + if (ret) + ret->s_addr = lease->address; + return 1; + } + + return -ENOENT; +} + +int sd_dhcp_server_get_lease_address_by_name(sd_dhcp_server *server, const char *name, struct in_addr *ret) { + int r; + + assert_return(server, -EINVAL); + assert_return(dns_name_is_valid(name), -EINVAL); + + r = find_lease_address(server->static_leases_by_address, name, ret); + if (r != -ENOENT) + return r; + + return find_lease_address(server->bound_leases_by_address, name, ret); +} diff --git a/src/systemd/sd-dhcp-server.h b/src/systemd/sd-dhcp-server.h index 2069b9d2875..787d2f41696 100644 --- a/src/systemd/sd-dhcp-server.h +++ b/src/systemd/sd-dhcp-server.h @@ -98,6 +98,8 @@ int sd_dhcp_server_is_in_relay_mode(sd_dhcp_server *server); int sd_dhcp_server_set_relay_target(sd_dhcp_server *server, const struct in_addr* address); int sd_dhcp_server_set_relay_agent_information(sd_dhcp_server *server, const char* circuit_id, const char* remote_id); +int sd_dhcp_server_get_lease_address_by_name(sd_dhcp_server *server, const char *name, struct in_addr *ret); + _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_server, sd_dhcp_server_unref); _SD_END_DECLARATIONS;