diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index e478902e0ef..ba2fd73b452 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -44,6 +44,8 @@ struct sd_dhcp_lease { be32_t next_server; struct in_addr *dns; size_t dns_size; + struct in_addr *ntp; + size_t ntp_size; uint16_t mtu; char *domainname; char *hostname; diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index aa479ffe15b..69418d98eae 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -72,6 +72,20 @@ int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, struct in_addr **addr, size_t *a return 0; } +int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size) { + assert_return(lease, -EINVAL); + assert_return(addr, -EINVAL); + assert_return(addr_size, -EINVAL); + + if (lease->ntp_size) { + *addr_size = lease->ntp_size; + *addr = lease->ntp; + } else + return -ENOENT; + + return 0; +} + int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname) { assert_return(lease, -EINVAL); assert_return(domainname, -EINVAL); @@ -213,6 +227,24 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option, break; + case DHCP_OPTION_NTP_SERVER: + if (len && !(len % 4)) { + unsigned i; + + lease->ntp_size = len / 4; + + free(lease->ntp); + lease->ntp = new0(struct in_addr, lease->ntp_size); + if (!lease->ntp) + return -ENOMEM; + + for (i = 0; i < lease->ntp_size; i++) { + memcpy(&lease->ntp[i].s_addr, option + 4 * i, 4); + } + } + + break; + case DHCP_OPTION_INTERFACE_MTU: if (len >= 2) { be16_t mtu; diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index f3595ebc5bb..252c09399dd 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -36,6 +36,7 @@ int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, struct in_addr *addr); int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr); int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr); int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size); +int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, struct in_addr **addr, size_t *addr_size); int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu); int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname); int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);