]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd-link: parse linkinfo to get kind
authorTobias Jungel <tobias.jungel@bisdn.de>
Thu, 9 Jun 2016 11:44:31 +0000 (13:44 +0200)
committerTobias Jungel <tobias.jungel@bisdn.de>
Thu, 9 Jun 2016 19:42:05 +0000 (21:42 +0200)
src/network/networkd-link.c
src/network/networkd-link.h

index 6746d88fc86663994c6f69eb36d04a654315887c..5f25873b46e715decae66c7053716f8a77d0262b 100644 (file)
@@ -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);
 
index 7db94e79e8c395b8b6e8f7a6e0098548cea88ee8..2809b1fe0b96df20a3b45435cff4964b283ad451 100644 (file)
@@ -68,6 +68,7 @@ typedef struct Link {
 
         int ifindex;
         char *ifname;
+        char *kind;
         unsigned short iftype;
         char *state_file;
         struct ether_addr mac;