]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind-session: watch pidfd in session_set_leader_consume
authorMike Yuan <me@yhndnzj.com>
Sun, 24 Dec 2023 11:06:01 +0000 (19:06 +0800)
committerMike Yuan <me@yhndnzj.com>
Thu, 4 Jan 2024 08:19:20 +0000 (16:19 +0800)
src/login/logind-session-dbus.c
src/login/logind-session.c
src/login/logind-session.h
src/login/logind.c

index 9348ccc4dd0e3f7a65306c12fa6a9febbf66f3ca..15f04c4a66aaeedd08511cc9bd732e9f5579d0a9 100644 (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);
 
index 31d483ff30545184eadf786a2cfe38d68923b886..cdd299e0064933c1d171ca36c3fa2f16aa684cc7 100644 (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;
 
index eaf9b4a6493802ee686d153ee46d53bd4108067e..95d49bb224188b17d7b19fe8b232b5b6108cc819 100644 (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);
index 4124d3675c5b0fa24fc359291ca1a7b54953a760..8387c026aa959fa1eaa678d7cf23dacbdb8b0a74 100644 (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;
 }