]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkctl: use varlink methods to bring up/down interfaces 40693/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 16 Feb 2026 03:47:25 +0000 (12:47 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 16 Feb 2026 09:37:17 +0000 (18:37 +0900)
Then,
- polkit authentication can be used,
- dynamic configuration engine can be safely stopped before bringing
  down interfaces.

Fixes #38538.

src/network/networkctl-misc.c

index 9844789c592afc542231cb019cd4d53213242f27..701efee0788600086cc55d23ec12f37d365f4190 100644 (file)
@@ -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;
 }