logind-session: watch pidfd in session_set_leader_consume
This commit is contained in:
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user