X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fsd-network.c;h=cc4b160e74e3598583d02c9ba5e66604364bda0a;hb=ee8c45689526ca973407cbb77bce7b96a062c40b;hp=91d6275056bf3eff87c8abd0124ccb4fac0f0cae;hpb=653912918f594ebbca46806b302ef6b477402575;p=elogind.git diff --git a/src/network/sd-network.c b/src/network/sd-network.c index 91d627505..cc4b160e7 100644 --- a/src/network/sd-network.c +++ b/src/network/sd-network.c @@ -107,62 +107,64 @@ _public_ int sd_network_get_link_operational_state(int ifindex, char **state) { return 0; } -_public_ int sd_network_get_dhcp_lease(int ifindex, sd_dhcp_lease **ret) { - _cleanup_free_ char *p = NULL, *s = NULL; - sd_dhcp_lease *lease = NULL; +_public_ int sd_network_get_link_llmnr(int ifindex, char **llmnr) { + _cleanup_free_ char *s = NULL, *p = NULL; int r; assert_return(ifindex > 0, -EINVAL); - assert_return(ret, -EINVAL); + assert_return(llmnr, -EINVAL); if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0) return -ENOMEM; - r = parse_env_file(p, NEWLINE, "DHCP_LEASE", &s, NULL); - - if (r < 0) + r = parse_env_file(p, NEWLINE, "LLMNR", &s, NULL); + if (r == -ENOENT) + return -ENODATA; + else if (r < 0) return r; else if (!s) - return -EIO; - - r = dhcp_lease_load(s, &lease); - if (r < 0) - return r; + return -ENODATA; - *ret = lease; + *llmnr = s; + s = NULL; return 0; } -static int network_get_in_addr(const char *key, int ifindex, struct in_addr **addr) { +_public_ int sd_network_get_link_dhcp_lease(int ifindex, sd_dhcp_lease **ret) { _cleanup_free_ char *p = NULL, *s = NULL; + sd_dhcp_lease *lease = NULL; int r; assert_return(ifindex > 0, -EINVAL); - assert_return(addr, -EINVAL); + assert_return(ret, -EINVAL); if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0) return -ENOMEM; - r = parse_env_file(p, NEWLINE, key, &s, NULL); + r = parse_env_file(p, NEWLINE, "DHCP_LEASE", &s, NULL); + if (r < 0) return r; else if (!s) return -EIO; - return deserialize_in_addrs(addr, s); -} + r = dhcp_lease_load(s, &lease); + if (r < 0) + return r; -_public_ int sd_network_get_dns(int ifindex, struct in_addr **addr) { - return network_get_in_addr("DNS", ifindex, addr); + *ret = lease; + + return 0; } -static int network_get_in6_addr(const char *key, int ifindex, struct in6_addr **addr) { +static int network_get_link_strv(const char *key, int ifindex, char ***ret) { _cleanup_free_ char *p = NULL, *s = NULL; + _cleanup_strv_free_ char **a = NULL; int r; assert_return(ifindex > 0, -EINVAL); - assert_return(addr, -EINVAL); + assert_return(ret, -EINVAL); if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0) return -ENOMEM; @@ -170,40 +172,31 @@ static int network_get_in6_addr(const char *key, int ifindex, struct in6_addr ** r = parse_env_file(p, NEWLINE, key, &s, NULL); if (r < 0) return r; - else if (!s) - return -EIO; - - return deserialize_in6_addrs(addr, s); -} - -_public_ int sd_network_get_dns6(int ifindex, struct in6_addr **addr) { - return network_get_in6_addr("DNS", ifindex, addr); -} - -static int network_get_boolean(const char *key, int ifindex) { - _cleanup_free_ char *p = NULL, *s = NULL; - int r; + else if (!s) { + *ret = NULL; - assert_return(ifindex > 0, -EINVAL); + return 0; + } - if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0) + a = strv_split(s, " "); + if (!a) return -ENOMEM; - r = parse_env_file(p, NEWLINE, key, &s, NULL); - if (r < 0) - return r; - else if (!s) - return false; + strv_uniq(a); + r = strv_length(a); + + *ret = a; + a = NULL; - return parse_boolean(s); + return r; } -_public_ int sd_network_dhcp_use_dns(int ifindex) { - return network_get_boolean("DHCP_USE_DNS", ifindex); +_public_ int sd_network_get_link_dns(int ifindex, char ***ret) { + return network_get_link_strv("DNS", ifindex, ret); } -_public_ int sd_network_dhcp_use_ntp(int ifindex) { - return network_get_boolean("DHCP_USE_NTP", ifindex); +_public_ int sd_network_get_link_ntp(int ifindex, char ***ret) { + return network_get_link_strv("NTP", ifindex, ret); } static inline int MONITOR_TO_FD(sd_network_monitor *m) {