chiark / gitweb /
udev: link-config - split connection to sockets from loading of configs
[elogind.git] / src / udev / net / link-config.c
index a86c74d5f7ebcab88b86698b1baa1be1e8c747a5..f93a4d835d44b2971d60cf018892ddb5c9dacbf6 100644 (file)
@@ -54,7 +54,6 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free);
 
 int link_config_ctx_new(link_config_ctx **ret) {
         _cleanup_link_config_ctx_free_ link_config_ctx *ctx = NULL;
-        int r;
 
         if (!ret)
                 return -EINVAL;
@@ -63,16 +62,10 @@ int link_config_ctx_new(link_config_ctx **ret) {
         if (!ctx)
                 return -ENOMEM;
 
-        r = ethtool_connect(&ctx->ethtool_fd);
-        if (r < 0)
-                return r;
-
-        r = sd_rtnl_open(0, &ctx->rtnl);
-        if (r < 0)
-                return r;
-
         LIST_HEAD_INIT(ctx->links);
 
+        ctx->ethtool_fd = -1;
+
         ctx->link_dirs = strv_new("/etc/systemd/network",
                                   "/run/systemd/network",
                                   "/usr/lib/systemd/network",
@@ -93,6 +86,23 @@ int link_config_ctx_new(link_config_ctx **ret) {
         return 0;
 }
 
+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;
+
+        r = sd_rtnl_open(0, &ctx->rtnl);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 static void link_configs_free(link_config_ctx *ctx) {
         link_config *link, *link_next;
 
@@ -293,7 +303,7 @@ static int rtnl_set_properties(sd_rtnl *rtnl, int ifindex, const char *name, con
         }
 
         if  (need_update) {
-                r = sd_rtnl_send_with_reply_and_block(rtnl, message, 5 * USEC_PER_SEC, NULL);
+                r = sd_rtnl_send_with_reply_and_block(rtnl, message, 0, NULL);
                 if (r < 0)
                         return r;
         }
@@ -406,6 +416,10 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
         struct ether_addr *mac = NULL;
         int r, ifindex;
 
+        r = link_config_ctx_connect(ctx);
+        if (r < 0)
+                return r;
+
         name = udev_device_get_sysname(device);
         if (!name)
                 return -EINVAL;