]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-server: add api to get address from hostname, based on lease data
authorLennart Poettering <lennart@poettering.net>
Mon, 13 Oct 2025 09:25:50 +0000 (11:25 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 15 Nov 2025 06:44:24 +0000 (07:44 +0100)
src/libsystemd-network/sd-dhcp-server.c
src/systemd/sd-dhcp-server.h

index 7503160643617201091f74551285d4291817c6d4..c86e4e0e0c1e40bffe82d1411db4ca5f7e703e1b 100644 (file)
@@ -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);
+}
index 2069b9d2875c56fa18994bf325d5521d286016ed..787d2f41696d8efa82dbe168070ec3da2270f486 100644 (file)
@@ -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;