]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp6-client: support multiple NTP server options
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 24 Sep 2021 05:09:14 +0000 (14:09 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 29 Sep 2021 06:29:41 +0000 (15:29 +0900)
Also, it is allowed that the suboption appears multiple times, and each
suboption contains one NTP server.

src/libsystemd-network/dhcp6-lease-internal.h
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-dhcp6-lease.c

index d6311b7d383cfffd094611a31058adfc6d62c50a..85843363412e2f97c86ff41e70d428dfa2d23f8e 100644 (file)
@@ -50,7 +50,7 @@ int dhcp6_lease_get_pd_iaid(sd_dhcp6_lease *lease, be32_t *iaid);
 
 int dhcp6_lease_set_dns(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
 int dhcp6_lease_add_domains(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
-int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
+int dhcp6_lease_add_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
 int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) ;
 int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
 
index 604b9f5e4bd6e03e575340969547e224ec14aa38..1564ebee7322ff879832fc0a0c9054e37c792915 100644 (file)
@@ -1257,7 +1257,7 @@ static int client_parse_message(
                         break;
 
                 case SD_DHCP6_OPTION_NTP_SERVER:
-                        r = dhcp6_lease_set_ntp(lease, optval, optlen);
+                        r = dhcp6_lease_add_ntp(lease, optval, optlen);
                         if (r < 0)
                                 return r;
 
index 0a292a3f51682e273ed152b839d6259084efc866..7c9d421a94e04b9ffa275312284ba18185a933df 100644 (file)
@@ -242,15 +242,12 @@ int sd_dhcp6_lease_get_domains(sd_dhcp6_lease *lease, char ***ret) {
         return strv_length(lease->domains);
 }
 
-int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) {
+int dhcp6_lease_add_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) {
         int r;
 
         assert_return(lease, -EINVAL);
         assert_return(optval, -EINVAL);
 
-        lease->ntp = mfree(lease->ntp);
-        lease->ntp_count = 0;
-
         for (size_t offset = 0; offset < optlen;) {
                 const uint8_t *subval;
                 size_t sublen;
@@ -273,13 +270,18 @@ int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t opt
                         break;
 
                 case DHCP6_NTP_SUBOPTION_SRV_FQDN: {
-                        char **servers;
+                        _cleanup_free_ char *server = NULL;
 
-                        r = dhcp6_option_parse_domainname_list(subval, sublen, &servers);
+                        r = dhcp6_option_parse_domainname(subval, sublen, &server);
                         if (r < 0)
                                 return r;
 
-                        strv_free_and_replace(lease->ntp_fqdn, servers);
+                        if (strv_contains(lease->ntp_fqdn, server))
+                                continue;
+
+                        r = strv_consume(&lease->ntp_fqdn, TAKE_PTR(server));
+                        if (r < 0)
+                                return r;
 
                         break;
                 }}