From fe8db0c5ee3365a2fc80ee7ebffa238f9a0a2ae2 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 27 Feb 2014 01:24:05 +0100 Subject: [PATCH] sd-network: add new library This is similar to sd-login, but exposes the state of networkd rather than logind. Include it in libsystemd-dhcp and rename it to libsystemd-network. --- Makefile.am | 46 ++-- .../Makefile | 0 .../dhcp-internal.h | 0 .../dhcp-lease-internal.h} | 4 +- .../dhcp-network.c | 0 .../dhcp-option.c | 0 .../dhcp-packet.c | 3 +- .../dhcp-protocol.h | 0 .../sd-dhcp-client.c | 2 +- .../sd-dhcp-lease.c} | 159 +++++++++++- .../test-dhcp-client.c | 0 .../test-dhcp-option.c | 0 src/network/networkd-link.c | 72 ++++++ src/network/networkd.c | 5 + src/network/networkd.h | 6 + src/network/sd-network.c | 237 ++++++++++++++++++ src/systemd/sd-dhcp-client.h | 12 +- src/systemd/sd-dhcp-lease.h | 41 +++ src/systemd/sd-network.h | 87 +++++++ 19 files changed, 638 insertions(+), 36 deletions(-) rename src/{libsystemd-dhcp => libsystemd-network}/Makefile (100%) rename src/{libsystemd-dhcp => libsystemd-network}/dhcp-internal.h (100%) rename src/{libsystemd-dhcp/dhcp-lease.h => libsystemd-network/dhcp-lease-internal.h} (92%) rename src/{libsystemd-dhcp => libsystemd-network}/dhcp-network.c (100%) rename src/{libsystemd-dhcp => libsystemd-network}/dhcp-option.c (100%) rename src/{libsystemd-dhcp => libsystemd-network}/dhcp-packet.c (98%) rename src/{libsystemd-dhcp => libsystemd-network}/dhcp-protocol.h (100%) rename src/{libsystemd-dhcp => libsystemd-network}/sd-dhcp-client.c (99%) rename src/{libsystemd-dhcp/dhcp-lease.c => libsystemd-network/sd-dhcp-lease.c} (60%) rename src/{libsystemd-dhcp => libsystemd-network}/test-dhcp-client.c (100%) rename src/{libsystemd-dhcp => libsystemd-network}/test-dhcp-option.c (100%) create mode 100644 src/network/sd-network.c create mode 100644 src/systemd/sd-dhcp-lease.h create mode 100644 src/systemd/sd-network.h diff --git a/Makefile.am b/Makefile.am index 25b48e50d..b7c38b687 100644 --- a/Makefile.am +++ b/Makefile.am @@ -196,6 +196,7 @@ AM_CPPFLAGS = \ -I $(top_srcdir)/src/libsystemd/sd-bus \ -I $(top_srcdir)/src/libsystemd/sd-event \ -I $(top_srcdir)/src/libsystemd/sd-rtnl \ + -I $(top_srcdir)/src/libsystemd-network \ $(OUR_CPPFLAGS) AM_CFLAGS = $(OUR_CFLAGS) @@ -2398,41 +2399,44 @@ busctl_CFLAGS = \ # ------------------------------------------------------------------------------ noinst_LTLIBRARIES += \ - libsystemd-dhcp.la + libsystemd-network.la -libsystemd_dhcp_la_SOURCES = \ +libsystemd_network_la_SOURCES = \ + src/systemd/sd-network.h \ src/systemd/sd-dhcp-client.h \ - src/libsystemd-dhcp/sd-dhcp-client.c \ - src/libsystemd-dhcp/dhcp-lease.h \ - src/libsystemd-dhcp/dhcp-lease.c \ - src/libsystemd-dhcp/dhcp-network.c \ - src/libsystemd-dhcp/dhcp-option.c \ - src/libsystemd-dhcp/dhcp-packet.c \ - src/libsystemd-dhcp/dhcp-internal.h \ - src/libsystemd-dhcp/dhcp-protocol.h - -libsystemd_dhcp_la_LIBADD = \ + src/systemd/sd-dhcp-lease.h \ + src/network/sd-network.c \ + src/libsystemd-network/sd-dhcp-client.c \ + src/libsystemd-network/dhcp-network.c \ + src/libsystemd-network/dhcp-option.c \ + src/libsystemd-network/dhcp-packet.c \ + src/libsystemd-network/dhcp-internal.h \ + src/libsystemd-network/dhcp-protocol.h \ + src/libsystemd-network/dhcp-lease-internal.h \ + src/libsystemd-network/sd-dhcp-lease.c + +libsystemd_network_la_LIBADD = \ libsystemd-internal.la \ libsystemd-shared.la test_dhcp_option_SOURCES = \ - src/libsystemd-dhcp/dhcp-protocol.h \ - src/libsystemd-dhcp/dhcp-internal.h \ - src/libsystemd-dhcp/test-dhcp-option.c + src/libsystemd-network/dhcp-protocol.h \ + src/libsystemd-network/dhcp-internal.h \ + src/libsystemd-network/test-dhcp-option.c test_dhcp_option_LDADD = \ - libsystemd-dhcp.la \ + libsystemd-network.la \ libsystemd-internal.la \ libsystemd-shared.la test_dhcp_client_SOURCES = \ src/systemd/sd-dhcp-client.h \ - src/libsystemd-dhcp/dhcp-protocol.h \ - src/libsystemd-dhcp/dhcp-internal.h \ - src/libsystemd-dhcp/test-dhcp-client.c + src/libsystemd-network/dhcp-protocol.h \ + src/libsystemd-network/dhcp-internal.h \ + src/libsystemd-network/test-dhcp-client.c test_dhcp_client_LDADD = \ - libsystemd-dhcp.la \ + libsystemd-network.la \ libsystemd-internal.la \ libsystemd-shared.la @@ -4033,7 +4037,7 @@ nodist_libsystemd_networkd_core_la_SOURCES = \ libsystemd_networkd_core_la_LIBADD = \ libudev-internal.la \ libsystemd-internal.la \ - libsystemd-dhcp.la \ + libsystemd-network.la \ libsystemd-label.la \ libsystemd-shared.la diff --git a/src/libsystemd-dhcp/Makefile b/src/libsystemd-network/Makefile similarity index 100% rename from src/libsystemd-dhcp/Makefile rename to src/libsystemd-network/Makefile diff --git a/src/libsystemd-dhcp/dhcp-internal.h b/src/libsystemd-network/dhcp-internal.h similarity index 100% rename from src/libsystemd-dhcp/dhcp-internal.h rename to src/libsystemd-network/dhcp-internal.h diff --git a/src/libsystemd-dhcp/dhcp-lease.h b/src/libsystemd-network/dhcp-lease-internal.h similarity index 92% rename from src/libsystemd-dhcp/dhcp-lease.h rename to src/libsystemd-network/dhcp-lease-internal.h index 87323dcb3..d12bcac24 100644 --- a/src/libsystemd-dhcp/dhcp-lease.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -25,7 +25,6 @@ #include #include -#include "socket-util.h" #include "refcnt.h" #include "dhcp-protocol.h" @@ -53,5 +52,8 @@ int dhcp_lease_new(sd_dhcp_lease **ret); int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option, void *user_data); +int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file); +int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret); + DEFINE_TRIVIAL_CLEANUP_FUNC(sd_dhcp_lease*, sd_dhcp_lease_unref); #define _cleanup_dhcp_lease_unref_ _cleanup_(sd_dhcp_lease_unrefp) diff --git a/src/libsystemd-dhcp/dhcp-network.c b/src/libsystemd-network/dhcp-network.c similarity index 100% rename from src/libsystemd-dhcp/dhcp-network.c rename to src/libsystemd-network/dhcp-network.c diff --git a/src/libsystemd-dhcp/dhcp-option.c b/src/libsystemd-network/dhcp-option.c similarity index 100% rename from src/libsystemd-dhcp/dhcp-option.c rename to src/libsystemd-network/dhcp-option.c diff --git a/src/libsystemd-dhcp/dhcp-packet.c b/src/libsystemd-network/dhcp-packet.c similarity index 98% rename from src/libsystemd-dhcp/dhcp-packet.c rename to src/libsystemd-network/dhcp-packet.c index 8388e5622..95c4277f8 100644 --- a/src/libsystemd-dhcp/dhcp-packet.c +++ b/src/libsystemd-network/dhcp-packet.c @@ -30,8 +30,9 @@ #include "list.h" #include "dhcp-protocol.h" -#include "dhcp-lease.h" +#include "dhcp-lease-internal.h" #include "dhcp-internal.h" +#include "sd-dhcp-lease.h" #include "sd-dhcp-client.h" #define DHCP_CLIENT_MIN_OPTIONS_SIZE 312 diff --git a/src/libsystemd-dhcp/dhcp-protocol.h b/src/libsystemd-network/dhcp-protocol.h similarity index 100% rename from src/libsystemd-dhcp/dhcp-protocol.h rename to src/libsystemd-network/dhcp-protocol.h diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c similarity index 99% rename from src/libsystemd-dhcp/sd-dhcp-client.c rename to src/libsystemd-network/sd-dhcp-client.c index 0c82260df..1f676ccb6 100644 --- a/src/libsystemd-dhcp/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -29,8 +29,8 @@ #include "list.h" #include "dhcp-protocol.h" -#include "dhcp-lease.h" #include "dhcp-internal.h" +#include "dhcp-lease-internal.h" #include "sd-dhcp-client.h" struct sd_dhcp_client { diff --git a/src/libsystemd-dhcp/dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c similarity index 60% rename from src/libsystemd-dhcp/dhcp-lease.c rename to src/libsystemd-network/sd-dhcp-lease.c index c1f76aa56..0529b6d8f 100644 --- a/src/libsystemd-dhcp/dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -23,14 +23,18 @@ #include #include #include +#include #include #include "util.h" #include "list.h" +#include "mkdir.h" +#include "fileio.h" #include "dhcp-protocol.h" #include "dhcp-internal.h" -#include "dhcp-lease.h" +#include "dhcp-lease-internal.h" +#include "sd-dhcp-lease.h" #include "sd-dhcp-client.h" int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) { @@ -242,3 +246,156 @@ int dhcp_lease_new(sd_dhcp_lease **ret) { return 0; } + +int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) { + _cleanup_free_ char *temp_path = NULL; + _cleanup_fclose_ FILE *f = NULL; + char buf[INET_ADDRSTRLEN]; + struct in_addr address; + const char *string; + uint16_t mtu; + int r; + + assert(lease); + assert(lease_file); + + r = mkdir_safe_label("/run/systemd/network/leases", 0755, 0, 0); + if (r < 0) + goto finish; + + r = fopen_temporary(lease_file, &f, &temp_path); + if (r < 0) + goto finish; + + fchmod(fileno(f), 0644); + + r = sd_dhcp_lease_get_address(lease, &address); + if (r < 0) + goto finish; + + string = inet_ntop(AF_INET, &address, buf, INET_ADDRSTRLEN); + if (!string) { + r = -errno; + goto finish; + } + + fprintf(f, + "# This is private data. Do not parse.\n" + "ADDRESS=%s\n", string); + + r = sd_dhcp_lease_get_router(lease, &address); + if (r < 0) + goto finish; + + string = inet_ntop(AF_INET, &address, buf, INET_ADDRSTRLEN); + if (!string) { + r = -errno; + goto finish; + } + + fprintf(f, + "ROUTER=%s\n", string); + + r = sd_dhcp_lease_get_netmask(lease, &address); + if (r < 0) + goto finish; + + string = inet_ntop(AF_INET, &address, buf, INET_ADDRSTRLEN); + if (!string) { + r = -errno; + goto finish; + } + + fprintf(f, + "NETMASK=%s\n", string); + + r = sd_dhcp_lease_get_mtu(lease, &mtu); + if (r >= 0) + fprintf(f, "MTU=%" PRIu16 "\n", mtu); + +/* TODO: DNS. See resolv.conf writing in network-manager.c */ + + r = sd_dhcp_lease_get_domainname(lease, &string); + if (r >= 0) + fprintf(f, "DOMAINNAME=%s\n", string); + + r = sd_dhcp_lease_get_hostname(lease, &string); + if (r >= 0) + fprintf(f, "HOSTNAME=%s\n", string); + + r = 0; + + fflush(f); + + if (ferror(f) || rename(temp_path, lease_file) < 0) { + r = -errno; + unlink(lease_file); + unlink(temp_path); + } + +finish: + if (r < 0) + log_error("Failed to save lease data %s: %s", lease_file, strerror(-r)); + + return r; +} + +int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret) { + _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL; + _cleanup_free_ char *address = NULL, *router = NULL, *netmask = NULL, + *mtu = NULL; + struct in_addr addr; + int r; + + assert(lease_file); + assert(ret); + + r = dhcp_lease_new(&lease); + if (r < 0) + return r; + + r = parse_env_file(lease_file, NEWLINE, + "ADDRESS", &address, + "ROUTER", &router, + "NETMASK", &netmask, + "MTU", &mtu, + "DOMAINNAME", &lease->domainname, + "HOSTNAME", &lease->hostname, + NULL); + if (r < 0) { + if (r == -ENOENT) + return 0; + + log_error("Failed to read %s: %s", lease_file, strerror(-r)); + return r; + } + + r = inet_pton(AF_INET, address, &addr); + if (r < 0) + return r; + + lease->address = addr.s_addr; + + r = inet_pton(AF_INET, router, &addr); + if (r < 0) + return r; + + lease->router = addr.s_addr; + + r = inet_pton(AF_INET, netmask, &addr); + if (r < 0) + return r; + + lease->subnet_mask = addr.s_addr; + + if (mtu) { + uint16_t u; + if (sscanf(mtu, "%" SCNu16, &u) > 0) + lease->mtu = u; + } + + *ret = lease; + lease = NULL; + + return 0; +} diff --git a/src/libsystemd-dhcp/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c similarity index 100% rename from src/libsystemd-dhcp/test-dhcp-client.c rename to src/libsystemd-network/test-dhcp-client.c diff --git a/src/libsystemd-dhcp/test-dhcp-option.c b/src/libsystemd-network/test-dhcp-option.c similarity index 100% rename from src/libsystemd-dhcp/test-dhcp-option.c rename to src/libsystemd-network/test-dhcp-option.c diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index b217123ec..f09fb7546 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -28,6 +28,8 @@ #include "bus-util.h" #include "net-util.h" +#include "dhcp-lease-internal.h" + int link_new(Manager *manager, struct udev_device *device, Link **ret) { _cleanup_link_free_ Link *link = NULL; const char *mac; @@ -51,6 +53,11 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) { if (link->ifindex <= 0) return -EINVAL; + r = asprintf(&link->state_file, "/run/systemd/network/links/%u", + (unsigned) link->ifindex); + if (r < 0) + return r; + mac = udev_device_get_sysattr_value(device, "address"); if (mac) { mac_addr = ether_aton(mac); @@ -83,6 +90,7 @@ void link_free(Link *link) { hashmap_remove(link->manager->links, &link->ifindex); free(link->ifname); + free(link->state_file); free(link); } @@ -139,6 +147,8 @@ static int link_enter_configured(Link *link) { link->state = LINK_STATE_CONFIGURED; + link_save(link); + return 0; } @@ -148,6 +158,8 @@ static void link_enter_failed(Link *link) { log_warning_link(link, "failed"); link->state = LINK_STATE_FAILED; + + link_save(link); } static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) { @@ -900,6 +912,8 @@ static int link_enter_enslave(Link *link) { link->state = LINK_STATE_ENSLAVING; + link_save(link); + if (!link->network->bridge && !link->network->bond && hashmap_isempty(link->network->vlans) && hashmap_isempty(link->network->macvlans)) @@ -1066,3 +1080,61 @@ int link_update(Link *link, sd_rtnl_message *m) { return link_update_flags(link, flags); } + +int link_save(Link *link) { + _cleanup_free_ char *temp_path = NULL; + _cleanup_fclose_ FILE *f = NULL; + int r; + + assert(link); + assert(link->state_file); + + r = mkdir_safe_label("/run/systemd/network/links", 0755, 0, 0); + if (r < 0) + goto finish; + + r = fopen_temporary(link->state_file, &f, &temp_path); + if (r < 0) + goto finish; + + fchmod(fileno(f), 0644); + + fprintf(f, + "# This is private data. Do not parse.\n" + "STATE=%s\n", + link_state_to_string(link->state)); + + if (link->dhcp_lease) { + const char *lease_file = "/run/systemd/network/leases/test.lease"; + + r = dhcp_lease_save(link->dhcp_lease, lease_file); + if (r < 0) + goto finish; + + fprintf(f, "DHCP_LEASE=%s\n", lease_file); + } + + fflush(f); + + if (ferror(f) || rename(temp_path, link->state_file) < 0) { + r = -errno; + unlink(link->state_file); + unlink(temp_path); + } + +finish: + if (r < 0) + log_error("Failed to save link data %s: %s", link->state_file, strerror(-r)); + + return r; +} + +static const char* const link_state_table[_LINK_STATE_MAX] = { + [LINK_STATE_ENSLAVING] = "configuring", + [LINK_STATE_SETTING_ADDRESSES] = "configuring", + [LINK_STATE_SETTING_ROUTES] = "configuring", + [LINK_STATE_CONFIGURED] = "configured", + [LINK_STATE_FAILED] = "failed", +}; + +DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState); diff --git a/src/network/networkd.c b/src/network/networkd.c index 00e9a5f3d..a80740bbe 100644 --- a/src/network/networkd.c +++ b/src/network/networkd.c @@ -40,6 +40,11 @@ int main(int argc, char *argv[]) { goto out; } + /* Always create the directories people can create inotify + * watches in. */ + mkdir_label("/run/systemd/network/links", 0755); + mkdir_label("/run/systemd/network/leases", 0755); + r = manager_new(&m); if (r < 0) { log_error("Could not create manager: %s", strerror(-r)); diff --git a/src/network/networkd.h b/src/network/networkd.h index 85c300982..e9c0dd512 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -189,6 +189,7 @@ struct Link { uint64_t ifindex; char *ifname; + char *state_file; struct ether_addr mac; unsigned flags; @@ -354,6 +355,11 @@ int link_configure(Link *link); int link_update(Link *link, sd_rtnl_message *message); +int link_save(Link *link); + +const char* link_state_to_string(LinkState s) _const_; +LinkState link_state_from_string(const char *s) _pure_; + DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); #define _cleanup_link_free_ _cleanup_(link_freep) diff --git a/src/network/sd-network.c b/src/network/sd-network.c new file mode 100644 index 000000000..746987366 --- /dev/null +++ b/src/network/sd-network.c @@ -0,0 +1,237 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2011 Lennart Poettering + Copyright 2014 Tom Gundersen + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include +#include +#include +#include + +#include "util.h" +#include "macro.h" +#include "strv.h" +#include "fileio.h" +#include "sd-network.h" +#include "dhcp-lease-internal.h" + +_public_ int sd_network_get_link_state(unsigned index, char **state) { + char *p, *s = NULL; + int r; + + assert_return(index, -EINVAL); + assert_return(state, -EINVAL); + + if (asprintf(&p, "/run/systemd/network/links/%u", index) < 0) + return -ENOMEM; + + r = parse_env_file(p, NEWLINE, "STATE", &s, NULL); + free(p); + + if (r == -ENOENT) { + free(s); + s = strdup("unknown"); + if (!s) + return -ENOMEM; + + *state = s; + return 0; + } else if (r < 0) { + free(s); + return r; + } else if (!s) + return -EIO; + + *state = s; + return 0; +} + +_public_ int sd_network_get_dhcp_lease(unsigned index, sd_dhcp_lease **ret) { + sd_dhcp_lease *lease; + char *p, *s = NULL; + int r; + + assert_return(index, -EINVAL); + assert_return(ret, -EINVAL); + + if (asprintf(&p, "/run/systemd/network/links/%u", index) < 0) + return -ENOMEM; + + r = parse_env_file(p, NEWLINE, "DHCP_LEASE", &s, NULL); + free(p); + + if (r < 0) { + free(s); + return r; + } else if (!s) + return -EIO; + + r = dhcp_lease_load(s, &lease); + if (r < 0) + return r; + + *ret = lease; + + return 0; +} + +_public_ int sd_network_get_ifindices(unsigned **indices) { + _cleanup_closedir_ DIR *d; + int r = 0; + unsigned n = 0; + _cleanup_free_ uid_t *l = NULL; + + d = opendir("/run/systemd/network/links/"); + if (!d) + return -errno; + + for (;;) { + struct dirent *de; + int k; + unsigned index; + + errno = 0; + de = readdir(d); + if (!de && errno != 0) + return -errno; + + if (!de) + break; + + dirent_ensure_type(d, de); + + if (!dirent_is_file(de)) + continue; + + k = safe_atou(de->d_name, &index); + if (k < 0) + continue; + + if (indices) { + if ((unsigned) r >= n) { + unsigned *t; + + n = MAX(16, 2*r); + t = realloc(l, sizeof(unsigned) * n); + if (!t) + return -ENOMEM; + + l = t; + } + + assert((unsigned) r < n); + l[r++] = index; + } else + r++; + } + + if (indices) { + *indices = l; + l = NULL; + } + + return r; +} + +static inline int MONITOR_TO_FD(sd_network_monitor *m) { + return (int) (unsigned long) m - 1; +} + +static inline sd_network_monitor* FD_TO_MONITOR(int fd) { + return (sd_network_monitor*) (unsigned long) (fd + 1); +} + +_public_ int sd_network_monitor_new(const char *category, sd_network_monitor **m) { + int fd, k; + bool good = false; + + assert_return(m, -EINVAL); + + fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); + if (fd < 0) + return -errno; + + if (!category || streq(category, "netif")) { + k = inotify_add_watch(fd, "/run/systemd/network/links/", IN_MOVED_TO|IN_DELETE); + if (k < 0) { + close_nointr_nofail(fd); + return -errno; + } + + good = true; + } + + if (!good) { + close_nointr(fd); + return -EINVAL; + } + + *m = FD_TO_MONITOR(fd); + return 0; +} + +_public_ sd_network_monitor* sd_network_monitor_unref(sd_network_monitor *m) { + int fd; + + assert_return(m, NULL); + + fd = MONITOR_TO_FD(m); + close_nointr(fd); + + return NULL; +} + +_public_ int sd_network_monitor_flush(sd_network_monitor *m) { + + assert_return(m, -EINVAL); + + return flush_fd(MONITOR_TO_FD(m)); +} + +_public_ int sd_network_monitor_get_fd(sd_network_monitor *m) { + + assert_return(m, -EINVAL); + + return MONITOR_TO_FD(m); +} + +_public_ int sd_network_monitor_get_events(sd_network_monitor *m) { + + assert_return(m, -EINVAL); + + /* For now we will only return POLLIN here, since we don't + * need anything else ever for inotify. However, let's have + * this API to keep our options open should we later on need + * it. */ + return POLLIN; +} + +_public_ int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *timeout_usec) { + + assert_return(m, -EINVAL); + assert_return(timeout_usec, -EINVAL); + + /* For now we will only return (uint64_t) -1, since we don't + * need any timeout. However, let's have this API to keep our + * options open should we later on need it. */ + *timeout_usec = (uint64_t) -1; + return 0; +} diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index 87f5adb59..a60bb5832 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -26,6 +26,7 @@ #include #include "sd-event.h" +#include "sd-dhcp-lease.h" enum { DHCP_EVENT_STOP = 0, @@ -36,7 +37,6 @@ enum { }; typedef struct sd_dhcp_client sd_dhcp_client; -typedef struct sd_dhcp_lease sd_dhcp_lease; typedef void (*sd_dhcp_client_cb_t)(sd_dhcp_client *client, int event, void *userdata); @@ -52,16 +52,6 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client, const struct ether_addr *addr); int sd_dhcp_client_get_lease(sd_dhcp_client *client, sd_dhcp_lease **ret); -sd_dhcp_lease *sd_dhcp_lease_ref(sd_dhcp_lease *lease); -sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease); -int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr); -int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr); -int sd_dhcp_lease_get_router(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_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); - int sd_dhcp_client_stop(sd_dhcp_client *client); int sd_dhcp_client_start(sd_dhcp_client *client); void sd_dhcp_client_free(sd_dhcp_client *client); diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h new file mode 100644 index 000000000..af687a673 --- /dev/null +++ b/src/systemd/sd-dhcp-lease.h @@ -0,0 +1,41 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef foosddhcpleasehfoo +#define foosddhcpleasehfoo + +/*** + This file is part of systemd. + + Copyright (C) 2013 Intel Corporation. All rights reserved. + Copyright (C) 2014 Tom Gundersen + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include + +typedef struct sd_dhcp_lease sd_dhcp_lease; + +sd_dhcp_lease *sd_dhcp_lease_ref(sd_dhcp_lease *lease); +sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease); +int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr); +int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr); +int sd_dhcp_lease_get_router(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_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); + +#endif diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h new file mode 100644 index 000000000..c0b093d06 --- /dev/null +++ b/src/systemd/sd-network.h @@ -0,0 +1,87 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef foosdloginhfoo +#define foosdloginhfoo + +/*** + This file is part of systemd. + + Copyright 2011 Lennart Poettering + Copyright 2014 Tom Gundersen + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include + +#include "sd-dhcp-lease.h" + +#include "_sd-common.h" + +/* + * A few points: + * + * Instead of returning an empty string array or empty integer array, we + * may return NULL. + * + * Free the data the library returns with libc free(). String arrays + * are NULL terminated and you need to free the array itself in + * addition to the strings contained. + * + * We return error codes as negative errno, kernel-style. 0 or + * positive on success. + * + * These functions access data in /run. This is a virtual file systems, + * hence the accesses is relatively cheap. + * + * See sd-network(3) for more information. + */ + +_SD_BEGIN_DECLARATIONS; + +/* Get state from ifindex. Possible states: unknown, unmanaged, failed, configuring, configured */ +int sd_network_get_link_state(unsigned index, char**state); + +/* Get DHCPv4 lease from ifindex. */ +int sd_network_get_dhcp_lease(unsigned index, sd_dhcp_lease **ret); + +/* Get all network interfaces indices, store in *indices. Returns the + * number of indices. If indices is NULL only returns the number of indices. */ +int sd_network_get_ifindices(unsigned **indices); + +/* Monitor object */ +typedef struct sd_network_monitor sd_network_monitor; + +/* Create a new monitor. Category must be NULL. */ +int sd_network_monitor_new(const char *category, sd_network_monitor** ret); + +/* Destroys the passed monitor. Returns NULL. */ +sd_network_monitor* sd_network_monitor_unref(sd_network_monitor *m); + +/* Flushes the monitor */ +int sd_network_monitor_flush(sd_network_monitor *m); + +/* Get FD from monitor */ +int sd_network_monitor_get_fd(sd_network_monitor *m); + +/* Get poll() mask to monitor */ +int sd_network_monitor_get_events(sd_network_monitor *m); + +/* Get timeout for poll(), as usec value relative to CLOCK_MONOTONIC's epoch */ +int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *timeout_usec); + +_SD_END_DECLARATIONS; + +#endif -- 2.30.2