summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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;