]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-server: convert null address for e.g. DNS to server address
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 1 Feb 2022 07:09:17 +0000 (16:09 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 1 Feb 2022 07:09:17 +0000 (16:09 +0900)
src/libsystemd-network/sd-dhcp-server.c

index 5774bc880ebd89a29617b3d346f39ddd6bfc7e2d..80638992328630bc1b4e655a54f99c756b682757 100644 (file)
@@ -1276,6 +1276,18 @@ static int server_receive_message(sd_event_source *s, int fd,
         return 0;
 }
 
+static void dhcp_server_update_lease_servers(sd_dhcp_server *server) {
+        assert(server);
+        assert(server->address != 0);
+
+        /* Convert null address -> server address */
+
+        for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++)
+                for (size_t i = 0; i < server->servers[k].size; i++)
+                        if (in4_addr_is_null(&server->servers[k].addr[i]))
+                                server->servers[k].addr[i].s_addr = server->address;
+}
+
 int sd_dhcp_server_start(sd_dhcp_server *server) {
         int r;
 
@@ -1290,6 +1302,8 @@ int sd_dhcp_server_start(sd_dhcp_server *server) {
         assert_return(server->fd < 0, -EBUSY);
         assert_return(server->address != htobe32(INADDR_ANY), -EUNATCH);
 
+        dhcp_server_update_lease_servers(server);
+
         r = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
         if (r < 0) {
                 r = -errno;
@@ -1419,6 +1433,7 @@ int sd_dhcp_server_set_servers(
         struct in_addr *c = NULL;
 
         assert_return(server, -EINVAL);
+        assert_return(!sd_dhcp_server_is_running(server), -EBUSY);
         assert_return(addresses || n_addresses == 0, -EINVAL);
         assert_return(what >= 0, -EINVAL);
         assert_return(what < _SD_DHCP_LEASE_SERVER_TYPE_MAX, -EINVAL);