1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2011 Lennart Poettering
7 Copyright 2014 Tom Gundersen
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #include <sys/inotify.h>
34 #include "sd-network.h"
35 #include "network-internal.h"
36 #include "dhcp-lease-internal.h"
38 _public_ int sd_network_get_link_state(int ifindex, char **state) {
39 _cleanup_free_ char *s = NULL, *p = NULL;
42 assert_return(ifindex > 0, -EINVAL);
43 assert_return(state, -EINVAL);
45 if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
48 r = parse_env_file(p, NEWLINE, "ADMIN_STATE", &s, NULL);
56 if (streq(s, "initializing"))
65 _public_ int sd_network_get_operational_state(char **state) {
66 _cleanup_free_ char *s = NULL;
69 assert_return(state, -EINVAL);
71 r = parse_env_file("/run/systemd/netif/state", NEWLINE, "OPER_STATE",
86 _public_ int sd_network_get_link_operational_state(int ifindex, char **state) {
87 _cleanup_free_ char *s = NULL, *p = NULL;
90 assert_return(ifindex > 0, -EINVAL);
91 assert_return(state, -EINVAL);
93 if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
96 r = parse_env_file(p, NEWLINE, "OPER_STATE", &s, NULL);
110 _public_ int sd_network_get_llmnr(int ifindex, char **llmnr) {
111 _cleanup_free_ char *s = NULL, *p = NULL;
114 assert_return(ifindex > 0, -EINVAL);
115 assert_return(llmnr, -EINVAL);
117 r = parse_env_file(p, NEWLINE, "LLMNR", &s, NULL);
129 _public_ int sd_network_get_dhcp_lease(int ifindex, sd_dhcp_lease **ret) {
130 _cleanup_free_ char *p = NULL, *s = NULL;
131 sd_dhcp_lease *lease = NULL;
134 assert_return(ifindex > 0, -EINVAL);
135 assert_return(ret, -EINVAL);
137 if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
140 r = parse_env_file(p, NEWLINE, "DHCP_LEASE", &s, NULL);
147 r = dhcp_lease_load(s, &lease);
156 static int network_get_strv(const char *key, int ifindex, char ***ret) {
157 _cleanup_free_ char *p = NULL, *s = NULL;
158 _cleanup_strv_free_ char **a = NULL;
161 assert_return(ifindex > 0, -EINVAL);
162 assert_return(ret, -EINVAL);
164 if (asprintf(&p, "/run/systemd/netif/links/%d", ifindex) < 0)
167 r = parse_env_file(p, NEWLINE, key, &s, NULL);
176 a = strv_split(s, " ");
189 _public_ int sd_network_get_dns(int ifindex, char ***ret) {
190 return network_get_strv("DNS", ifindex, ret);
193 _public_ int sd_network_get_ntp(int ifindex, char ***ret) {
194 return network_get_strv("NTP", ifindex, ret);
197 static inline int MONITOR_TO_FD(sd_network_monitor *m) {
198 return (int) (unsigned long) m - 1;
201 static inline sd_network_monitor* FD_TO_MONITOR(int fd) {
202 return (sd_network_monitor*) (unsigned long) (fd + 1);
205 _public_ int sd_network_monitor_new(sd_network_monitor **m, const char *category) {
209 assert_return(m, -EINVAL);
211 fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC);
215 if (!category || streq(category, "links")) {
216 k = inotify_add_watch(fd, "/run/systemd/netif/links/", IN_MOVED_TO|IN_DELETE);
225 if (!category || streq(category, "leases")) {
226 k = inotify_add_watch(fd, "/run/systemd/netif/leases/", IN_MOVED_TO|IN_DELETE);
240 *m = FD_TO_MONITOR(fd);
244 _public_ sd_network_monitor* sd_network_monitor_unref(sd_network_monitor *m) {
247 assert_return(m, NULL);
249 fd = MONITOR_TO_FD(m);
255 _public_ int sd_network_monitor_flush(sd_network_monitor *m) {
257 assert_return(m, -EINVAL);
259 return flush_fd(MONITOR_TO_FD(m));
262 _public_ int sd_network_monitor_get_fd(sd_network_monitor *m) {
264 assert_return(m, -EINVAL);
266 return MONITOR_TO_FD(m);
269 _public_ int sd_network_monitor_get_events(sd_network_monitor *m) {
271 assert_return(m, -EINVAL);
273 /* For now we will only return POLLIN here, since we don't
274 * need anything else ever for inotify. However, let's have
275 * this API to keep our options open should we later on need
280 _public_ int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *timeout_usec) {
282 assert_return(m, -EINVAL);
283 assert_return(timeout_usec, -EINVAL);
285 /* For now we will only return (uint64_t) -1, since we don't
286 * need any timeout. However, let's have this API to keep our
287 * options open should we later on need it. */
288 *timeout_usec = (uint64_t) -1;