network: Add varlink socket unit

This commit is contained in:
Daan De Meyer
2025-07-03 11:22:34 +02:00
committed by DaanDeMeyer
parent a63f0ea73d
commit b0ea79c5b5
6 changed files with 54 additions and 12 deletions
+8 -3
View 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");
}
+1 -1
View 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);
+14 -6
View 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;