]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: split create session reply handling in two 35924/head
authorLennart Poettering <lennart@poettering.net>
Tue, 19 Nov 2024 22:25:31 +0000 (23:25 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 10 Jan 2025 12:59:56 +0000 (13:59 +0100)
This prepares ground so that later on we can reply with either D-Bus or
Varlink depending on the client's request.

src/login/logind-session-dbus.c
src/login/logind-session-dbus.h
src/login/logind-session.c
src/login/logind-session.h

index 11c315ade77cf52860825fde4fb552d97ed88926..2affc32b16d77936c6346d72e91df3953e0284c9 100644 (file)
@@ -899,62 +899,40 @@ int session_send_lock_all(Manager *m, bool lock) {
         return r;
 }
 
-static bool session_job_pending(Session *s) {
+int session_send_create_reply_bus(Session *s, const sd_bus_error *error) {
         assert(s);
-        assert(s->user);
 
-        /* Check if we have some jobs enqueued and not finished yet. Each time we get JobRemoved signal about
-         * relevant units, session_send_create_reply and hence us is called (see match_job_removed).
-         * Note that we don't care about job result here. */
+        /* This is called after the session scope and the user service were successfully created, and
+         * finishes where manager_create_session() left off. */
 
-        return s->scope_job ||
-               s->user->runtime_dir_job ||
-               (SESSION_CLASS_WANTS_SERVICE_MANAGER(s->class) && s->user->service_manager_job);
-}
-
-int session_send_create_reply(Session *s, const 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;
-
-        assert(s);
-
-        /* This is called after the session scope and the user service were successfully created, and finishes where
-         * bus_manager_create_session() left off. */
-
-        if (!s->create_message)
-                return 0;
-
-        /* If error occurred, return it immediately. Otherwise let's wait for all jobs to finish before
-         * continuing. */
-        if (!sd_bus_error_is_set(error) && session_job_pending(s))
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *c = TAKE_PTR(s->create_message);
+        if (!c)
                 return 0;
 
-        c = TAKE_PTR(s->create_message);
-        if (error)
+        if (sd_bus_error_is_set(error))
                 return sd_bus_reply_method_error(c, error);
 
-        fifo_fd = session_create_fifo(s);
+        _cleanup_close_ int fifo_fd = session_create_fifo(s);
         if (fifo_fd < 0)
                 return fifo_fd;
 
         /* Update the session state file before we notify the client about the result. */
         session_save(s);
 
-        p = session_bus_path(s);
+        _cleanup_free_ char *p = session_bus_path(s);
         if (!p)
                 return -ENOMEM;
 
-        log_debug("Sending reply about created session: "
-                  "id=%s object_path=%s uid=%u runtime_path=%s "
+        log_debug("Sending D-Bus reply about created session: "
+                  "id=%s object_path=%s uid=" UID_FMT " runtime_path=%s "
                   "session_fd=%d seat=%s vtnr=%u",
                   s->id,
                   p,
-                  (uint32_t) s->user->user_record->uid,
+                  s->user->user_record->uid,
                   s->user->runtime_path,
                   fifo_fd,
                   s->seat ? s->seat->id : "",
-                  (uint32_t) s->vtnr);
+                  s->vtnr);
 
         return sd_bus_reply_method_return(
                         c, "soshusub",
index 2ff686dbd2fb222e6a2c281f79f3672f7b6e2c17..091ad26292fa562d7437be8a9466b390e3ba5b1e 100644 (file)
@@ -15,7 +15,7 @@ int session_send_changed(Session *s, const char *properties, ...) _sentinel_;
 int session_send_lock(Session *s, bool lock);
 int session_send_lock_all(Manager *m, bool lock);
 
-int session_send_create_reply(Session *s, const sd_bus_error *error);
+int session_send_create_reply_bus(Session *s, const sd_bus_error *error);
 int session_send_upgrade_reply(Session *s, const sd_bus_error *error);
 
 int bus_session_method_activate(sd_bus_message *message, void *userdata, sd_bus_error *error);
index ed93fd7d9ef8a025b815ed7df0dc117e4f75fd70..5d13191af95b71a168a2af5895495257c97c9856 100644 (file)
@@ -1648,6 +1648,30 @@ void session_drop_controller(Session *s) {
         session_restore_vt(s);
 }
 
+bool session_job_pending(Session *s) {
+        assert(s);
+        assert(s->user);
+
+        /* Check if we have some jobs enqueued and not finished yet. Each time we get JobRemoved signal about
+         * relevant units, session_send_create_reply and hence us is called (see match_job_removed).
+         * Note that we don't care about job result here. */
+
+        return s->scope_job ||
+               s->user->runtime_dir_job ||
+               (SESSION_CLASS_WANTS_SERVICE_MANAGER(s->class) && s->user->service_manager_job);
+}
+
+int session_send_create_reply(Session *s, const sd_bus_error *error) {
+        assert(s);
+
+        /* If error occurred, return it immediately. Otherwise let's wait for all jobs to finish before
+         * continuing. */
+        if (!sd_bus_error_is_set(error) && session_job_pending(s))
+                return 0;
+
+        return session_send_create_reply_bus(s, error);
+}
+
 static const char* const session_state_table[_SESSION_STATE_MAX] = {
         [SESSION_OPENING] = "opening",
         [SESSION_ONLINE]  = "online",
index f7ee7a92b6ccd1d3e2776a4a56fe56e3fe6dc9b7..1f15b57f3872a0aeda7b0b9b800db7c7e5da1e39 100644 (file)
@@ -217,6 +217,10 @@ bool session_is_controller(Session *s, const char *sender);
 int session_set_controller(Session *s, const char *sender, bool force, bool prepare);
 void session_drop_controller(Session *s);
 
+bool session_job_pending(Session *s);
+
+int session_send_create_reply(Session *s, const sd_bus_error *error);
+
 static inline bool SESSION_IS_SELF(const char *name) {
         return isempty(name) || streq(name, "self");
 }