summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranck Bui <fbui@suse.com>2017-04-26 14:20:41 +0200
committerSven Eden <yamakuzure@gmx.net>2017-07-25 09:46:52 +0200
commitc3e41400d106b6c2482d9d42298fac1a6a882071 (patch)
tree90499afe24c28297edb669ab359ada04d05173dd
parent9045f431a2a7d05a3a897829eb2c2f0b77edd2be (diff)
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.
-rw-r--r--src/login/logind-session-dbus.c15
-rw-r--r--src/login/logind-session.c70
-rw-r--r--src/login/logind-session.h2
3 files changed, 6 insertions, 81 deletions
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;