From c3e41400d106b6c2482d9d42298fac1a6a882071 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Wed, 26 Apr 2017 14:20:41 +0200 Subject: logind: when setting a new controller, don't prepare the VT if logind is restarted When assigning a new session controller to a session, the VT is prepared so the controller can expect the VT to be in a good default state. However when logind is restarted and a session controller already took control of a session, there's no need to prepare th VT otherwise logind may screw up the VT state set by the controller. This patch prevents the preparation of the VT in this case. --- src/login/logind-session-dbus.c | 15 ++------- src/login/logind-session.c | 70 +++-------------------------------------- src/login/logind-session.h | 2 -- 3 files changed, 6 insertions(+), 81 deletions(-) (limited to 'src') diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 1316c5008..93495fbe8 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -444,23 +444,14 @@ static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_er * equivalent). */ return sd_bus_error_setf(error, BUS_ERROR_DEVICE_IS_TAKEN, "Device already taken"); - r = session_device_new(s, dev, true, &sd); + r = session_device_new(s, dev, &sd); if (r < 0) return r; - r = session_device_save(sd); - if (r < 0) - goto error; - r = sd_bus_reply_method_return(message, "hb", sd->fd, !sd->active); if (r < 0) - goto error; - - session_save(s); - return 0; + session_device_free(sd); -error: - session_device_free(sd); return r; } @@ -487,8 +478,6 @@ static int method_release_device(sd_bus_message *message, void *userdata, sd_bus return sd_bus_error_setf(error, BUS_ERROR_DEVICE_NOT_TAKEN, "Device not taken"); session_device_free(sd); - session_save(s); - return sd_bus_reply_method_return(message, NULL); } diff --git a/src/login/logind-session.c b/src/login/logind-session.c index a2709f3d0..d67eb02f7 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -154,18 +154,6 @@ void session_set_user(Session *s, User *u) { LIST_PREPEND(sessions_by_user, u->sessions, s); } -static void session_save_devices(Session *s, FILE *f) { - SessionDevice *sd; - Iterator i; - - if (!hashmap_isempty(s->devices)) { - fprintf(f, "DEVICES="); - HASHMAP_FOREACH(sd, s->devices, i) - fprintf(f, "%u:%u ", major(sd->dev), minor(sd->dev)); - fprintf(f, "\n"); - } -} - int session_save(Session *s) { _cleanup_free_ char *temp_path = NULL; _cleanup_fclose_ FILE *f = NULL; @@ -297,10 +285,8 @@ int session_save(Session *s) { s->timestamp.realtime, s->timestamp.monotonic); - if (s->controller) { + if (s->controller) fprintf(f, "CONTROLLER=%s\n", s->controller); - session_save_devices(s, f); - } r = fflush_and_check(f); if (r < 0) @@ -322,43 +308,6 @@ fail: return log_error_errno(r, "Failed to save session data %s: %m", s->state_file); } -static int session_load_devices(Session *s, const char *devices) { - const char *p; - int r = 0; - - assert(s); - - for (p = devices;;) { - _cleanup_free_ char *word = NULL; - SessionDevice *sd; - dev_t dev; - int k; - - k = extract_first_word(&p, &word, NULL, 0); - if (k == 0) - break; - if (k < 0) { - r = k; - break; - } - - k = parse_dev(word, &dev); - if (k < 0) { - r = k; - continue; - } - - /* The file descriptors for loaded devices will be reattached later. */ - k = session_device_new(s, dev, false, &sd); - if (k < 0) - r = k; - } - - if (r < 0) - log_error_errno(r, "Loading session devices for session %s failed: %m", s->id); - - return r; -} int session_load(Session *s) { _cleanup_free_ char *remote = NULL, @@ -372,9 +321,7 @@ int session_load(Session *s) { *uid = NULL, *realtime = NULL, *monotonic = NULL, - *controller = NULL, - *active = NULL, - *devices = NULL; + *controller = NULL; int k, r; @@ -404,8 +351,6 @@ int session_load(Session *s) { "REALTIME", &realtime, "MONOTONIC", &monotonic, "CONTROLLER", &controller, - "ACTIVE", &active, - "DEVICES", &devices, NULL); if (r < 0) @@ -508,17 +453,10 @@ int session_load(Session *s) { if (monotonic) timestamp_deserialize(monotonic, &s->timestamp.monotonic); - if (active) { - k = parse_boolean(active); - if (k >= 0) - s->was_active = k; - } - if (controller) { - if (bus_name_has_owner(s->manager->bus, controller, NULL) > 0) { + if (bus_name_has_owner(s->manager->bus, controller, NULL) > 0) session_set_controller(s, controller, false, false); - session_load_devices(s, devices); - } else + else session_restore_vt(s); } diff --git a/src/login/logind-session.h b/src/login/logind-session.h index 1e7f3ad49..924b0a072 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -113,8 +113,6 @@ struct Session { bool started:1; bool stopping:1; - bool was_active:1; - sd_bus_message *create_message; sd_event_source *timer_event_source; -- cgit v1.2.3