]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Add varlink socket unit
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 27 Jun 2025 13:08:44 +0000 (15:08 +0200)
committerDaanDeMeyer <daan.j.demeyer@gmail.com>
Thu, 3 Jul 2025 09:22:34 +0000 (11:22 +0200)
src/network/networkd-manager-varlink.c
src/network/networkd-manager-varlink.h
src/network/networkd-manager.c
units/meson.build
units/systemd-networkd-varlink.socket [new file with mode: 0644]
units/systemd-networkd.service.in

index d44318870979ee16aece102b8d94f3a59d66de17..1697efd771d0a0d9634a87c4befef3541d38239b 100644 (file)
@@ -259,8 +259,9 @@ static int vl_method_set_persistent_storage(sd_varlink *vlink, sd_json_variant *
         return sd_varlink_reply(vlink, NULL);
 }
 
-int manager_connect_varlink(Manager *m) {
+int manager_connect_varlink(Manager *m, int fd) {
         _cleanup_(sd_varlink_server_unrefp) sd_varlink_server *s = NULL;
+        _unused_ _cleanup_close_ int fd_close = fd;
         int r;
 
         assert(m);
@@ -297,10 +298,15 @@ int manager_connect_varlink(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Failed to register varlink methods: %m");
 
-        r = sd_varlink_server_listen_address(s, "/run/systemd/netif/io.systemd.Network", 0666);
+        if (fd < 0)
+                r = sd_varlink_server_listen_address(s, "/run/systemd/netif/io.systemd.Network", /* mode= */ 0666);
+        else
+                r = sd_varlink_server_listen_fd(s, fd);
         if (r < 0)
                 return log_error_errno(r, "Failed to bind to varlink socket: %m");
 
+        TAKE_FD(fd_close);
+
         r = sd_varlink_server_attach_event(s, m->event, SD_EVENT_PRIORITY_NORMAL);
         if (r < 0)
                 return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
@@ -313,5 +319,4 @@ void manager_varlink_done(Manager *m) {
         assert(m);
 
         m->varlink_server = sd_varlink_server_unref(m->varlink_server);
-        (void) unlink("/run/systemd/netif/io.systemd.Network");
 }
index 992e48839e68777d7d766fd12b8690d2d7dbf586..bd5cede4046d6b411020bcc109c211a5ba889601 100644 (file)
@@ -3,5 +3,5 @@
 
 #include "networkd-forward.h"
 
-int manager_connect_varlink(Manager *m);
+int manager_connect_varlink(Manager *m, int fd);
 void manager_varlink_done(Manager *m);
index a0455544cf46091a251e0fb8c85cf179ebd9a63c..82aa1337feeae1271737b7ddf1fa3a8d6f6b69fc 100644 (file)
@@ -205,12 +205,13 @@ static int manager_connect_udev(Manager *m) {
         return 0;
 }
 
-static int manager_listen_fds(Manager *m, int *ret_rtnl_fd) {
+static int manager_listen_fds(Manager *m, int *ret_rtnl_fd, int *ret_varlink_fd) {
         _cleanup_strv_free_ char **names = NULL;
-        int n, rtnl_fd = -EBADF;
+        int n, rtnl_fd = -EBADF, varlink_fd = -EBADF;
 
         assert(m);
         assert(ret_rtnl_fd);
+        assert(ret_varlink_fd);
 
         n = sd_listen_fds_with_names(/* unset_environment = */ true, &names);
         if (n < 0)
@@ -221,7 +222,7 @@ static int manager_listen_fds(Manager *m, int *ret_rtnl_fd) {
 
                 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
                         if (rtnl_fd >= 0) {
-                                log_debug("Received multiple netlink socket, ignoring.");
+                                log_debug("Received multiple netlink sockets, ignoring.");
                                 goto unused;
                         }
 
@@ -229,6 +230,11 @@ static int manager_listen_fds(Manager *m, int *ret_rtnl_fd) {
                         continue;
                 }
 
+                if (streq(names[i], "varlink")) {
+                        varlink_fd = fd;
+                        continue;
+                }
+
                 if (manager_set_serialization_fd(m, fd, names[i]) >= 0)
                         continue;
 
@@ -243,6 +249,8 @@ static int manager_listen_fds(Manager *m, int *ret_rtnl_fd) {
         }
 
         *ret_rtnl_fd = rtnl_fd;
+        *ret_varlink_fd = varlink_fd;
+
         return 0;
 }
 
@@ -513,7 +521,7 @@ static int manager_set_keep_configuration(Manager *m) {
 }
 
 int manager_setup(Manager *m) {
-        _cleanup_close_ int rtnl_fd = -EBADF;
+        _cleanup_close_ int rtnl_fd = -EBADF, varlink_fd = -EBADF;
         int r;
 
         assert(m);
@@ -537,7 +545,7 @@ int manager_setup(Manager *m) {
         if (r < 0)
                 return r;
 
-        r = manager_listen_fds(m, &rtnl_fd);
+        r = manager_listen_fds(m, &rtnl_fd, &varlink_fd);
         if (r < 0)
                 return r;
 
@@ -552,7 +560,7 @@ int manager_setup(Manager *m) {
         if (m->test_mode)
                 return 0;
 
-        r = manager_connect_varlink(m);
+        r = manager_connect_varlink(m, TAKE_FD(varlink_fd));
         if (r < 0)
                 return r;
 
index 8a3ce203a10cbf4f742a66e3b0b2e58babccac90..c595c1de5a3d39b87f21c62a4b32accdaa8550e3 100644 (file)
@@ -502,6 +502,10 @@ units = [
           'file' : 'systemd-networkd-persistent-storage.service',
           'conditions' : ['ENABLE_NETWORKD'],
         },
+        {
+          'file' : 'systemd-networkd-varlink.socket',
+          'conditions' : ['ENABLE_NETWORKD'],
+        },
         {
           'file' : 'systemd-networkd-wait-online.service.in',
           'conditions' : ['ENABLE_NETWORKD'],
diff --git a/units/systemd-networkd-varlink.socket b/units/systemd-networkd-varlink.socket
new file mode 100644 (file)
index 0000000..0f2304f
--- /dev/null
@@ -0,0 +1,25 @@
+#  SPDX-License-Identifier: LGPL-2.1-or-later
+#
+#  This file is part of systemd.
+#
+#  systemd is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as published by
+#  the Free Software Foundation; either version 2.1 of the License, or
+#  (at your option) any later version.
+
+[Unit]
+Description=Network Service Varlink Socket
+Documentation=man:systemd-networkd.service(8)
+ConditionCapability=CAP_NET_ADMIN
+DefaultDependencies=no
+Before=sockets.target shutdown.target
+Conflicts=shutdown.target
+
+[Socket]
+ListenStream=/run/systemd/netif/io.systemd.Network
+FileDescriptorName=varlink
+SocketMode=0666
+Service=systemd-networkd.service
+
+[Install]
+WantedBy=sockets.target
index 6fb2b7e2dbaa7f5a1a472ed69fce254598995ab7..c7bcf73a27da4e25c0b42177626c35b6faa0482f 100644 (file)
@@ -46,7 +46,7 @@ RestrictRealtime=yes
 RestrictSUIDSGID=yes
 RuntimeDirectory=systemd/netif
 RuntimeDirectoryPreserve=yes
-Sockets=systemd-networkd.socket
+Sockets=systemd-networkd.socket systemd-networkd-varlink.socket
 SystemCallArchitectures=native
 SystemCallErrorNumber=EPERM
 SystemCallFilter=@system-service bpf
@@ -56,7 +56,7 @@ User=systemd-network
 
 [Install]
 WantedBy=multi-user.target
-Also=systemd-networkd.socket
+Also=systemd-networkd.socket systemd-networkd-varlink.socket
 Alias=dbus-org.freedesktop.network1.service
 
 # The output from this generator is used by udevd and networkd. Enable it by