diff options
author | Tobias Jungel <tobias.jungel@bisdn.de> | 2016-06-09 13:44:31 +0200 |
---|---|---|
committer | Tobias Jungel <tobias.jungel@bisdn.de> | 2016-06-09 21:42:05 +0200 |
commit | 6cad256dbe6343de4329934ea7c08707a365d340 (patch) | |
tree | 79fa82afebbc82509011c86c32e0f689e0058656 /src/network | |
parent | d643a60a9e0be4bea0495f4f1a3792eb2300e48d (diff) |
networkd-link: parse linkinfo to get kind
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/networkd-link.c | 20 | ||||
-rw-r--r-- | src/network/networkd-link.h | 1 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6746d88fc8..5f25873b46 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -396,7 +396,7 @@ static int link_update_flags(Link *link, sd_netlink_message *m) { static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) { _cleanup_link_unref_ Link *link = NULL; uint16_t type; - const char *ifname; + const char *ifname, *kind = NULL; int r, ifindex; unsigned short iftype; @@ -404,6 +404,15 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) { assert(message); assert(ret); + /* check for link kind */ + r = sd_netlink_message_enter_container(message, IFLA_LINKINFO); + if (r == 0) { + (void)sd_netlink_message_read_string(message, IFLA_INFO_KIND, &kind); + r = sd_netlink_message_exit_container(message); + if (r < 0) + return r; + } + r = sd_netlink_message_get_type(message, &type); if (r < 0) return r; @@ -438,6 +447,12 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) { if (!link->ifname) return -ENOMEM; + if (kind) { + link->kind = strdup(kind); + if (!link->kind) + return -ENOMEM; + } + r = sd_netlink_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac); if (r < 0) log_link_debug_errno(link, r, "MAC address not found for new device, continuing without"); @@ -515,6 +530,9 @@ static void link_free(Link *link) { free(link->ifname); + if (link->kind) + free(link->kind); + (void)unlink(link->state_file); free(link->state_file); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 7db94e79e8..2809b1fe0b 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -68,6 +68,7 @@ typedef struct Link { int ifindex; char *ifname; + char *kind; unsigned short iftype; char *state_file; struct ether_addr mac; |