* 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;
}
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);
}
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;
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)
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,
*uid = NULL,
*realtime = NULL,
*monotonic = NULL,
- *controller = NULL,
- *active = NULL,
- *devices = NULL;
+ *controller = NULL;
int k, r;
"REALTIME", &realtime,
"MONOTONIC", &monotonic,
"CONTROLLER", &controller,
- "ACTIVE", &active,
- "DEVICES", &devices,
NULL);
if (r < 0)
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);
}