logind-session: watch pidfd in session_set_leader_consume

This commit is contained in:
Mike Yuan
2024-01-04 16:19:20 +08:00
parent 9d5b690100
commit 0ae9073f15
4 changed files with 38 additions and 39 deletions
-5
View File
@@ -807,7 +807,6 @@ int session_send_create_reply(Session *s, sd_bus_error *error) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *c = NULL;
_cleanup_close_ int fifo_fd = -EBADF;
_cleanup_free_ char *p = NULL;
int r;
assert(s);
@@ -828,10 +827,6 @@ int session_send_create_reply(Session *s, sd_bus_error *error) {
if (fifo_fd < 0)
return fifo_fd;
r = session_watch_pidfd(s);
if (r < 0)
return r;
/* Update the session state file before we notify the client about the result. */
session_save(s);
+38 -31
View File
@@ -88,6 +88,38 @@ int session_new(Session **ret, Manager *m, const char *id) {
return 0;
}
static int session_dispatch_leader_pidfd(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
Session *s = ASSERT_PTR(userdata);
assert(s->leader.fd == fd);
session_stop(s, /* force= */ false);
return 1;
}
static int session_watch_pidfd(Session *s) {
int r;
assert(s);
assert(s->manager);
assert(pidref_is_set(&s->leader));
if (s->leader.fd < 0)
return 0;
r = sd_event_add_io(s->manager->event, &s->leader_pidfd_event_source, s->leader.fd, EPOLLIN, session_dispatch_leader_pidfd, s);
if (r < 0)
return r;
r = sd_event_source_set_priority(s->leader_pidfd_event_source, SD_EVENT_PRIORITY_IMPORTANT);
if (r < 0)
return r;
(void) sd_event_source_set_description(s->leader_pidfd_event_source, "session-pidfd");
return 0;
}
static void session_reset_leader(Session *s, bool keep_fdstore) {
assert(s);
@@ -101,6 +133,8 @@ static void session_reset_leader(Session *s, bool keep_fdstore) {
if (!pidref_is_set(&s->leader))
return;
s->leader_pidfd_event_source = sd_event_source_disable_unref(s->leader_pidfd_event_source);
(void) hashmap_remove_value(s->manager->sessions_by_leader, &s->leader, s);
return pidref_done(&s->leader);
@@ -200,6 +234,10 @@ int session_set_leader_consume(Session *s, PidRef _leader) {
s->leader = TAKE_PIDREF(pidref);
r = session_watch_pidfd(s);
if (r < 0)
return log_error_errno(r, "Failed to watch leader pidfd for session '%s': %m", s->id);
r = hashmap_ensure_put(&s->manager->sessions_by_leader, &pidref_hash_ops, &s->leader, s);
if (r < 0)
return r;
@@ -951,7 +989,6 @@ int session_finalize(Session *s) {
LOG_MESSAGE("Removed session %s.", s->id));
s->timer_event_source = sd_event_source_unref(s->timer_event_source);
s->leader_pidfd_event_source = sd_event_source_unref(s->leader_pidfd_event_source);
if (s->seat)
seat_evict_position(s->seat, s);
@@ -1259,36 +1296,6 @@ static void session_remove_fifo(Session *s) {
}
}
static int session_dispatch_leader_pidfd(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
Session *s = ASSERT_PTR(userdata);
assert(s->leader.fd == fd);
session_stop(s, /* force= */ false);
return 1;
}
int session_watch_pidfd(Session *s) {
int r;
assert(s);
if (s->leader.fd < 0)
return 0;
r = sd_event_add_io(s->manager->event, &s->leader_pidfd_event_source, s->leader.fd, EPOLLIN, session_dispatch_leader_pidfd, s);
if (r < 0)
return r;
r = sd_event_source_set_priority(s->leader_pidfd_event_source, SD_EVENT_PRIORITY_IMPORTANT);
if (r < 0)
return r;
(void) sd_event_source_set_description(s->leader_pidfd_event_source, "session-pidfd");
return 0;
}
bool session_may_gc(Session *s, bool drop_not_started) {
int r;
-1
View File
@@ -146,7 +146,6 @@ void session_set_type(Session *s, SessionType t);
int session_set_display(Session *s, const char *display);
int session_set_tty(Session *s, const char *tty);
int session_create_fifo(Session *s);
int session_watch_pidfd(Session *s);
int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error);
int session_stop(Session *s, bool force);
int session_finalize(Session *s);
-2
View File
@@ -465,8 +465,6 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
if (r < 0)
return log_warning_errno(r, "Failed to attach leader pidfd for session '%s': %m", s->id);
// FIXME: Maybe call session_watch_pidfd() here?
return 0;
}