From: Yu Watanabe Date: Mon, 16 Feb 2026 03:47:25 +0000 (+0900) Subject: networkctl: use varlink methods to bring up/down interfaces X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=067758a3beae386c48951036f2778ba403239a8b;p=thirdparty%2Fsystemd.git networkctl: use varlink methods to bring up/down interfaces Then, - polkit authentication can be used, - dynamic configuration engine can be safely stopped before bringing down interfaces. Fixes #38538. --- diff --git a/src/network/networkctl-misc.c b/src/network/networkctl-misc.c index 9844789c592..701efee0788 100644 --- a/src/network/networkctl-misc.c +++ b/src/network/networkctl-misc.c @@ -46,50 +46,31 @@ static int parse_interfaces(sd_netlink **rtnl, char *argv[], OrderedSet **ret) { return 0; } -static int link_up_down_send_message(sd_netlink *rtnl, char *command, int index) { - _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; - int r; - - assert(rtnl); - assert(index >= 0); - - r = sd_rtnl_message_new_link(rtnl, &req, RTM_SETLINK, index); - if (r < 0) - return rtnl_log_create_error(r); +int link_up_down(int argc, char *argv[], void *userdata) { + int r, ret = 0; - if (streq(command, "up")) - r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP); - else - r = sd_rtnl_message_link_set_flags(req, 0, IFF_UP); - if (r < 0) - return log_error_errno(r, "Could not set link flags: %m"); + bool up = streq_ptr(argv[0], "up"); - r = sd_netlink_call(rtnl, req, 0, NULL); + _cleanup_ordered_set_free_ OrderedSet *indexes = NULL; + r = parse_interfaces(/* rtnl= */ NULL, argv, &indexes); if (r < 0) return r; - return 0; -} - -int link_up_down(int argc, char *argv[], void *userdata) { - int r, ret = 0; - - _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL; - _cleanup_ordered_set_free_ OrderedSet *indexes = NULL; - r = parse_interfaces(&rtnl, argv, &indexes); + _cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *vl = NULL; + r = varlink_connect_networkd(&vl); if (r < 0) return r; + (void) polkit_agent_open_if_enabled(BUS_TRANSPORT_LOCAL, arg_ask_password); + void *p; - ORDERED_SET_FOREACH(p, indexes) { - int index = PTR_TO_INT(p); - r = link_up_down_send_message(rtnl, argv[0], index); - if (r < 0) { - RET_GATHER(ret, r); - log_error_errno(r, "Failed to bring %s interface %s: %m", - argv[0], FORMAT_IFNAME_FULL(index, FORMAT_IFNAME_IFINDEX)); - } - } + ORDERED_SET_FOREACH(p, indexes) + RET_GATHER(ret, varlink_callbo_and_log( + vl, + up ? "io.systemd.Network.LinkUp" : "io.systemd.Network.LinkDown", + /* reply= */ NULL, + SD_JSON_BUILD_PAIR_INTEGER("InterfaceIndex", PTR_TO_INT(p)), + SD_JSON_BUILD_PAIR_BOOLEAN("allowInteractiveAuthentication", arg_ask_password))); return ret; }