chiark / gitweb /
udev: link-config - split connection to sockets from loading of configs
authorTom Gundersen <teg@jklm.no>
Tue, 29 Oct 2013 16:48:58 +0000 (17:48 +0100)
committerTom Gundersen <teg@jklm.no>
Tue, 29 Oct 2013 16:57:21 +0000 (17:57 +0100)
We want to load the config in _init, but not connect to the sockets before we are forked.

src/udev/net/link-config.c

index 9d6c96b5a5cf1f1ff8f8cd779215875a690f7c37..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 link_config_ctx_new(link_config_ctx **ret) {
         _cleanup_link_config_ctx_free_ link_config_ctx *ctx = NULL;
-        int r;
 
         if (!ret)
                 return -EINVAL;
 
         if (!ret)
                 return -EINVAL;
@@ -63,16 +62,10 @@ int link_config_ctx_new(link_config_ctx **ret) {
         if (!ctx)
                 return -ENOMEM;
 
         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);
 
         LIST_HEAD_INIT(ctx->links);
 
+        ctx->ethtool_fd = -1;
+
         ctx->link_dirs = strv_new("/etc/systemd/network",
                                   "/run/systemd/network",
                                   "/usr/lib/systemd/network",
         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;
 }
 
         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;
 
 static void link_configs_free(link_config_ctx *ctx) {
         link_config *link, *link_next;
 
@@ -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;
 
         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;
         name = udev_device_get_sysname(device);
         if (!name)
                 return -EINVAL;