chiark / gitweb /
udev - link-setup - expose ID_NET_DRIVER
[elogind.git] / src / udev / net / link-config.c
index e8389c9be07df039888bbb7eeb9229db7b33b39e..40b1d7f7bc84ceb4316f24c193df8ab0033c314c 100644 (file)
@@ -90,16 +90,17 @@ int link_config_ctx_new(link_config_ctx **ret) {
 static int link_config_ctx_connect(link_config_ctx *ctx) {
         int r;
 
-        if (ctx->ethtool_fd >= 0 && ctx->rtnl)
-                return 0;
-
-        r = ethtool_connect(&ctx->ethtool_fd);
-        if (r < 0)
-                return r;
+        if (ctx->ethtool_fd == -1) {
+                r = ethtool_connect(&ctx->ethtool_fd);
+                if (r < 0)
+                        return r;
+        }
 
-        r = sd_rtnl_open(&ctx->rtnl, 0);
-        if (r < 0)
-                return r;
+        if (!ctx->rtnl) {
+                r = sd_rtnl_open(&ctx->rtnl, 0);
+                if (r < 0)
+                        return r;
+        }
 
         return 0;
 }
@@ -442,6 +443,27 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
         return 0;
 }
 
+int link_get_driver(link_config_ctx *ctx, struct udev_device *device, char **ret) {
+        const char *name;
+        char *driver;
+        int r;
+
+        r = link_config_ctx_connect(ctx);
+        if (r < 0)
+                return r;
+
+        name = udev_device_get_sysname(device);
+        if (!name)
+                return -EINVAL;
+
+        r = ethtool_get_driver(ctx->ethtool_fd, name, &driver);
+        if (r < 0)
+                return r;
+
+        *ret = driver;
+        return 0;
+}
+
 static const char* const mac_policy_table[] = {
         [MACPOLICY_PERSISTENT] = "persistent",
         [MACPOLICY_RANDOM] = "random"