diff options
Diffstat (limited to 'src')
| l--------- | src/libsystemd-network/Makefile (renamed from src/libsystemd-dhcp/Makefile) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-internal.h (renamed from src/libsystemd-dhcp/dhcp-internal.h) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-lease-internal.h (renamed from src/libsystemd-dhcp/dhcp-lease.h) | 4 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-network.c (renamed from src/libsystemd-dhcp/dhcp-network.c) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-option.c (renamed from src/libsystemd-dhcp/dhcp-option.c) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-packet.c (renamed from src/libsystemd-dhcp/dhcp-packet.c) | 3 | ||||
| -rw-r--r-- | src/libsystemd-network/dhcp-protocol.h (renamed from src/libsystemd-dhcp/dhcp-protocol.h) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/sd-dhcp-client.c (renamed from src/libsystemd-dhcp/sd-dhcp-client.c) | 2 | ||||
| -rw-r--r-- | src/libsystemd-network/sd-dhcp-lease.c (renamed from src/libsystemd-dhcp/dhcp-lease.c) | 159 | ||||
| -rw-r--r-- | src/libsystemd-network/test-dhcp-client.c (renamed from src/libsystemd-dhcp/test-dhcp-client.c) | 0 | ||||
| -rw-r--r-- | src/libsystemd-network/test-dhcp-option.c (renamed from src/libsystemd-dhcp/test-dhcp-option.c) | 0 | ||||
| -rw-r--r-- | src/network/networkd-link.c | 72 | ||||
| -rw-r--r-- | src/network/networkd.c | 5 | ||||
| -rw-r--r-- | src/network/networkd.h | 6 | ||||
| -rw-r--r-- | src/network/sd-network.c | 237 | ||||
| -rw-r--r-- | src/systemd/sd-dhcp-client.h | 12 | ||||
| -rw-r--r-- | src/systemd/sd-dhcp-lease.h | 41 | ||||
| -rw-r--r-- | src/systemd/sd-network.h | 87 | 
18 files changed, 613 insertions, 15 deletions
| diff --git a/src/libsystemd-dhcp/Makefile b/src/libsystemd-network/Makefile index d0b0e8e008..d0b0e8e008 120000 --- a/src/libsystemd-dhcp/Makefile +++ b/src/libsystemd-network/Makefile diff --git a/src/libsystemd-dhcp/dhcp-internal.h b/src/libsystemd-network/dhcp-internal.h index ce83b81631..ce83b81631 100644 --- a/src/libsystemd-dhcp/dhcp-internal.h +++ b/src/libsystemd-network/dhcp-internal.h diff --git a/src/libsystemd-dhcp/dhcp-lease.h b/src/libsystemd-network/dhcp-lease-internal.h index 87323dcb37..d12bcac247 100644 --- a/src/libsystemd-dhcp/dhcp-lease.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -25,7 +25,6 @@  #include <stdint.h>  #include <linux/if_packet.h> -#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 index 934e8bf13e..934e8bf13e 100644 --- a/src/libsystemd-dhcp/dhcp-network.c +++ b/src/libsystemd-network/dhcp-network.c diff --git a/src/libsystemd-dhcp/dhcp-option.c b/src/libsystemd-network/dhcp-option.c index 4d45b3b3a4..4d45b3b3a4 100644 --- a/src/libsystemd-dhcp/dhcp-option.c +++ b/src/libsystemd-network/dhcp-option.c diff --git a/src/libsystemd-dhcp/dhcp-packet.c b/src/libsystemd-network/dhcp-packet.c index 8388e56222..95c4277f8c 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 index 81d36cef27..81d36cef27 100644 --- a/src/libsystemd-dhcp/dhcp-protocol.h +++ b/src/libsystemd-network/dhcp-protocol.h diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 0c82260dfd..1f676ccb65 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 index c1f76aa561..0529b6d8fa 100644 --- a/src/libsystemd-dhcp/dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -23,14 +23,18 @@  #include <string.h>  #include <stdio.h>  #include <net/ethernet.h> +#include <arpa/inet.h>  #include <sys/param.h>  #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 index 8061e5fa83..8061e5fa83 100644 --- a/src/libsystemd-dhcp/test-dhcp-client.c +++ b/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 index 8659fd5025..8659fd5025 100644 --- a/src/libsystemd-dhcp/test-dhcp-option.c +++ b/src/libsystemd-network/test-dhcp-option.c diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index b217123ecc..f09fb7546d 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 00e9a5f3da..a80740bbea 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 85c300982f..e9c0dd5121 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 0000000000..7469873664 --- /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 <http://www.gnu.org/licenses/>. +***/ + +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <sys/inotify.h> +#include <sys/poll.h> + +#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 87f5adb597..a60bb5832f 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -26,6 +26,7 @@  #include <net/ethernet.h>  #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 0000000000..af687a673b --- /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 <http://www.gnu.org/licenses/>. +***/ + +#include <netinet/in.h> +#include <net/ethernet.h> + +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 0000000000..c0b093d067 --- /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 <http://www.gnu.org/licenses/>. +***/ + +#include <sys/types.h> +#include <inttypes.h> + +#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 | 
