summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-09-24 14:09:14 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-09-29 15:29:41 +0900
commit9c3d46bf8d933d6ff4da6876ebbc0f13d65bee76 (patch)
tree476bcb081f310adaaf6462a02a166b5749b36368
parent41b14f03297ccecdee9429c447cc85b471d3df21 (diff)
downloadsystemd-9c3d46bf8d933d6ff4da6876ebbc0f13d65bee76.tar.gz
sd-dhcp6-client: support multiple NTP server options
Also, it is allowed that the suboption appears multiple times, and each suboption contains one NTP server.
-rw-r--r--src/libsystemd-network/dhcp6-lease-internal.h2
-rw-r--r--src/libsystemd-network/sd-dhcp6-client.c2
-rw-r--r--src/libsystemd-network/sd-dhcp6-lease.c16
3 files changed, 11 insertions, 9 deletions
diff --git a/src/libsystemd-network/dhcp6-lease-internal.h b/src/libsystemd-network/dhcp6-lease-internal.h
index d6311b7d38..8584336341 100644
--- a/src/libsystemd-network/dhcp6-lease-internal.h
+++ b/src/libsystemd-network/dhcp6-lease-internal.h
@@ -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);
diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c
index 604b9f5e4b..1564ebee73 100644
--- a/src/libsystemd-network/sd-dhcp6-client.c
+++ b/src/libsystemd-network/sd-dhcp6-client.c
@@ -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;
diff --git a/src/libsystemd-network/sd-dhcp6-lease.c b/src/libsystemd-network/sd-dhcp6-lease.c
index 0a292a3f51..7c9d421a94 100644
--- a/src/libsystemd-network/sd-dhcp6-lease.c
+++ b/src/libsystemd-network/sd-dhcp6-lease.c
@@ -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;
}}