return 0;
}
-static int manager_listen_fds(Manager *manager) {
+static int manager_listen_fds(Manager *manager, int *ret_varlink_fd) {
_cleanup_strv_free_ char **names = NULL;
+ int varlink_fd = -EBADF;
int r;
assert(manager);
+ assert(ret_varlink_fd);
int n = sd_listen_fds_with_names(/* unset_environment = */ true, &names);
if (n < 0)
for (int i = 0; i < n; i++) {
int fd = SD_LISTEN_FDS_START + i;
- if (streq(names[i], "varlink"))
- r = 0; /* The fd will be handled by sd_varlink_server_listen_auto(). */
- else if (streq(names[i], "systemd-udevd-control.socket"))
+ if (streq(names[i], "varlink")) {
+ varlink_fd = fd;
+ r = 0;
+ } else if (streq(names[i], "systemd-udevd-control.socket"))
r = manager_init_ctrl(manager, fd);
else if (streq(names[i], "systemd-udevd-kernel.socket"))
r = manager_init_device_monitor(manager, fd);
close_and_notify_warn(fd, names[i]);
}
+ *ret_varlink_fd = varlink_fd;
+
return 0;
}
int manager_main(Manager *manager) {
+ _cleanup_close_ int varlink_fd = -EBADF;
int r;
assert(manager);
if (r < 0)
return r;
- r = manager_listen_fds(manager);
+ r = manager_listen_fds(manager, &varlink_fd);
if (r < 0)
return r;
if (r < 0)
return r;
- r = manager_start_varlink_server(manager);
+ r = manager_start_varlink_server(manager, TAKE_FD(varlink_fd));
if (r < 0)
return r;
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include "fd-util.h"
#include "json-util.h"
#include "log.h"
#include "string-util.h"
return sd_varlink_reply(link, NULL);
}
-int manager_start_varlink_server(Manager *manager) {
+int manager_start_varlink_server(Manager *manager, int fd) {
_cleanup_(sd_varlink_server_unrefp) sd_varlink_server *v = NULL;
+ _cleanup_close_ int fd_close = fd;
int r;
assert(manager);
if (r < 0)
return log_error_errno(r, "Failed to attach Varlink connection to event loop: %m");
- r = sd_varlink_server_listen_auto(v);
- if (r < 0)
- return log_error_errno(r, "Failed to bind to passed Varlink socket: %m");
- if (r == 0) {
+ if (fd < 0)
r = sd_varlink_server_listen_address(v, UDEV_VARLINK_ADDRESS, 0600);
- if (r < 0)
- return log_error_errno(r, "Failed to bind to Varlink socket: %m");
- }
+ else
+ r = sd_varlink_server_listen_fd(v, fd);
+ if (r < 0)
+ return log_error_errno(r, "Failed to bind to Varlink socket: %m");
+
+ TAKE_FD(fd_close);
r = sd_varlink_server_add_interface_many(
v,