mirror of
https://github.com/morgan9e/systemd
synced 2026-04-15 00:47:10 +09:00
login: Add varlink socket unit
This commit is contained in:
committed by
DaanDeMeyer
parent
0eb59bd5ae
commit
0470754f9d
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "alloc-util.h"
|
#include "alloc-util.h"
|
||||||
#include "cgroup-util.h"
|
#include "cgroup-util.h"
|
||||||
|
#include "fd-util.h"
|
||||||
#include "format-util.h"
|
#include "format-util.h"
|
||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
#include "json-util.h"
|
#include "json-util.h"
|
||||||
@@ -327,8 +328,9 @@ static int vl_method_release_session(sd_varlink *link, sd_json_variant *paramete
|
|||||||
return sd_varlink_reply(link, NULL);
|
return sd_varlink_reply(link, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int manager_varlink_init(Manager *m) {
|
int manager_varlink_init(Manager *m, int fd) {
|
||||||
_cleanup_(sd_varlink_server_unrefp) sd_varlink_server *s = NULL;
|
_cleanup_(sd_varlink_server_unrefp) sd_varlink_server *s = NULL;
|
||||||
|
_unused_ _cleanup_close_ int fd_close = fd;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
@@ -362,10 +364,15 @@ int manager_varlink_init(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to register varlink methods: %m");
|
return log_error_errno(r, "Failed to register varlink methods: %m");
|
||||||
|
|
||||||
r = sd_varlink_server_listen_address(s, "/run/systemd/io.systemd.Login", 0666);
|
if (fd < 0)
|
||||||
|
r = sd_varlink_server_listen_address(s, "/run/systemd/io.systemd.Login", /* mode= */ 0666);
|
||||||
|
else
|
||||||
|
r = sd_varlink_server_listen_fd(s, fd);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to bind to varlink socket: %m");
|
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);
|
r = sd_varlink_server_attach_event(s, m->event, SD_EVENT_PRIORITY_NORMAL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
|
return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "logind-forward.h"
|
#include "logind-forward.h"
|
||||||
|
|
||||||
int manager_varlink_init(Manager *m);
|
int manager_varlink_init(Manager *m, int fd);
|
||||||
void manager_varlink_done(Manager *m);
|
void manager_varlink_done(Manager *m);
|
||||||
|
|
||||||
int session_send_create_reply_varlink(Session *s, const sd_bus_error *error);
|
int session_send_create_reply_varlink(Session *s, const sd_bus_error *error);
|
||||||
|
|||||||
@@ -525,9 +525,8 @@ fail_close:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int manager_enumerate_sessions(Manager *m) {
|
static int manager_enumerate_sessions(Manager *m) {
|
||||||
_cleanup_strv_free_ char **fdnames = NULL;
|
|
||||||
_cleanup_closedir_ DIR *d = NULL;
|
_cleanup_closedir_ DIR *d = NULL;
|
||||||
int r = 0, n;
|
int r = 0;
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
@@ -560,6 +559,16 @@ static int manager_enumerate_sessions(Manager *m) {
|
|||||||
RET_GATHER(r, log_warning_errno(k, "Failed to deserialize session '%s', ignoring: %m", s->id));
|
RET_GATHER(r, log_warning_errno(k, "Failed to deserialize session '%s', ignoring: %m", s->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int manager_enumerate_fds(Manager *m, int *ret_varlink_fd) {
|
||||||
|
_cleanup_strv_free_ char **fdnames = NULL;
|
||||||
|
int varlink_fd = -EBADF, n, r = 0;
|
||||||
|
|
||||||
|
assert(m);
|
||||||
|
assert(ret_varlink_fd);
|
||||||
|
|
||||||
n = sd_listen_fds_with_names(/* unset_environment = */ true, &fdnames);
|
n = sd_listen_fds_with_names(/* unset_environment = */ true, &fdnames);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return log_error_errno(n, "Failed to acquire passed fd list: %m");
|
return log_error_errno(n, "Failed to acquire passed fd list: %m");
|
||||||
@@ -567,9 +576,18 @@ static int manager_enumerate_sessions(Manager *m) {
|
|||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
int fd = SD_LISTEN_FDS_START + i;
|
int fd = SD_LISTEN_FDS_START + i;
|
||||||
|
|
||||||
|
if (streq(fdnames[i], "varlink")) {
|
||||||
|
assert(varlink_fd < 0);
|
||||||
|
varlink_fd = fd;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
RET_GATHER(r, manager_attach_session_fd_one_consume(m, fdnames[i], fd));
|
RET_GATHER(r, manager_attach_session_fd_one_consume(m, fdnames[i], fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r >= 0)
|
||||||
|
*ret_varlink_fd = varlink_fd;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1171,6 +1189,7 @@ static int manager_dispatch_reload_signal(sd_event_source *s, const struct signa
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int manager_startup(Manager *m) {
|
static int manager_startup(Manager *m) {
|
||||||
|
_cleanup_close_ int varlink_fd = -EBADF;
|
||||||
int r;
|
int r;
|
||||||
Seat *seat;
|
Seat *seat;
|
||||||
Session *session;
|
Session *session;
|
||||||
@@ -1202,10 +1221,6 @@ static int manager_startup(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = manager_varlink_init(m);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
/* Instantiate magic seat 0 */
|
/* Instantiate magic seat 0 */
|
||||||
r = manager_add_seat(m, "seat0", &m->seat0);
|
r = manager_add_seat(m, "seat0", &m->seat0);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@@ -1232,6 +1247,10 @@ static int manager_startup(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_warning_errno(r, "Session enumeration failed: %m");
|
log_warning_errno(r, "Session enumeration failed: %m");
|
||||||
|
|
||||||
|
r = manager_enumerate_fds(m, &varlink_fd);
|
||||||
|
if (r < 0)
|
||||||
|
log_warning_errno(r, "File descriptor enumeration failed: %m");
|
||||||
|
|
||||||
r = manager_enumerate_inhibitors(m);
|
r = manager_enumerate_inhibitors(m);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_warning_errno(r, "Inhibitor enumeration failed: %m");
|
log_warning_errno(r, "Inhibitor enumeration failed: %m");
|
||||||
@@ -1240,6 +1259,10 @@ static int manager_startup(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_warning_errno(r, "Button enumeration failed: %m");
|
log_warning_errno(r, "Button enumeration failed: %m");
|
||||||
|
|
||||||
|
r = manager_varlink_init(m, TAKE_FD(varlink_fd));
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
manager_load_scheduled_shutdown(m);
|
manager_load_scheduled_shutdown(m);
|
||||||
|
|
||||||
/* Remove stale objects before we start them */
|
/* Remove stale objects before we start them */
|
||||||
|
|||||||
@@ -472,6 +472,11 @@ units = [
|
|||||||
'conditions' : ['ENABLE_LOCALED'],
|
'conditions' : ['ENABLE_LOCALED'],
|
||||||
'symlinks' : ['dbus-org.freedesktop.locale1.service'],
|
'symlinks' : ['dbus-org.freedesktop.locale1.service'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'file': 'systemd-logind-varlink.socket',
|
||||||
|
'conditions': ['ENABLE_LOGIND'],
|
||||||
|
'symlinks' : ['sockets.target.wants/'],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'file' : 'systemd-logind.service.in',
|
'file' : 'systemd-logind.service.in',
|
||||||
'conditions' : ['ENABLE_LOGIND'],
|
'conditions' : ['ENABLE_LOGIND'],
|
||||||
|
|||||||
18
units/systemd-logind-varlink.socket
Normal file
18
units/systemd-logind-varlink.socket
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# 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=User Login Management Varlink Socket
|
||||||
|
Documentation=man:systemd-logind.service(8)
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
ListenStream=/run/systemd/io.systemd.Login
|
||||||
|
FileDescriptorName=varlink
|
||||||
|
SocketMode=0666
|
||||||
|
Service=systemd-logind.service
|
||||||
Reference in New Issue
Block a user