X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fudev%2Fnet%2Flink-config.c;h=f93a4d835d44b2971d60cf018892ddb5c9dacbf6;hp=a86c74d5f7ebcab88b86698b1baa1be1e8c747a5;hb=977085794d2996320e345433403de75f662b0622;hpb=f1ac700248f231b7bdac2aafe8c35650efddb89f diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index a86c74d5f..f93a4d835 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -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;