chiark / gitweb /
logind: when setting a new controller, don't prepare the VT if logind is restarted
authorFranck Bui <fbui@suse.com>
Wed, 26 Apr 2017 12:20:41 +0000 (14:20 +0200)
committerSven Eden <yamakuzure@gmx.net>
Tue, 25 Jul 2017 07:46:52 +0000 (09:46 +0200)
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
src/login/logind-session.c
src/login/logind-session.h

index 1316c50..93495fb 100644 (file)
@@ -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);
 }
 
index a2709f3..d67eb02 100644 (file)
@@ -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);
         }
 
index 1e7f3ad..924b0a0 100644 (file)
@@ -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;