From a551f584e2009d5dbb7de8c952778364b9a2e45e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 19 Nov 2024 23:25:31 +0100 Subject: [PATCH] logind: split create session reply handling in two 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 | 46 +++++++++------------------------ src/login/logind-session-dbus.h | 2 +- src/login/logind-session.c | 24 +++++++++++++++++ src/login/logind-session.h | 4 +++ 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 11c315ade77..2affc32b16d 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -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", diff --git a/src/login/logind-session-dbus.h b/src/login/logind-session-dbus.h index 2ff686dbd2f..091ad26292f 100644 --- a/src/login/logind-session-dbus.h +++ b/src/login/logind-session-dbus.h @@ -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); diff --git a/src/login/logind-session.c b/src/login/logind-session.c index ed93fd7d9ef..5d13191af95 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -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", diff --git a/src/login/logind-session.h b/src/login/logind-session.h index f7ee7a92b6c..1f15b57f387 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -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"); } -- 2.47.3