#include "path-util.h"
#include "cgroup-util.h"
#include "logind-session.h"
+#include "fileio.h"
Session* session_new(Manager *m, User *u, const char *id) {
Session *s;
int r;
assert(s);
- assert(controller);
assert(path);
if (s->leader > 0) {
r = cg_create_and_attach(controller, path, s->leader);
if (r < 0)
- r = cg_create(controller, path);
+ r = cg_create(controller, path, NULL);
} else
- r = cg_create(controller, path);
+ r = cg_create(controller, path, NULL);
if (r < 0)
return r;
assert(s->user->cgroup_path);
if (!s->cgroup_path) {
- if (asprintf(&p, "%s/%s", s->user->cgroup_path, s->id) < 0)
+ _cleanup_free_ char *name = NULL, *escaped = NULL;
+
+ name = strappend(s->id, ".session");
+ if (!name)
+ return log_oom();
+
+ escaped = cg_escape(name);
+ if (!escaped)
+ return log_oom();
+
+ p = strjoin(s->user->cgroup_path, "/", escaped, NULL);
+ if (!p)
return log_oom();
} else
p = s->cgroup_path;
if (s->started)
session_send_signal(s, false);
+ s->started = false;
+
if (s->seat) {
if (s->seat->active == s)
seat_set_active(s->seat, NULL);
user_send_changed(s->user, "Sessions\0");
user_save(s->user);
- s->started = false;
-
return r;
}
}
int session_get_idle_hint(Session *s, dual_timestamp *t) {
- _cleanup_free_ char *p = NULL;
usec_t atime = 0, n;
int r;
return s->idle_hint;
}
- /* Graphical sessions really should really implement a real
+ /* Graphical sessions should really implement a real
* idle hint logic */
if (s->display)
goto dont_know;
/* Open reading side */
if (s->fifo_fd < 0) {
- struct epoll_event ev;
+ struct epoll_event ev = {};
s->fifo_fd = open(s->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY);
if (s->fifo_fd < 0)
if (r < 0)
return r;
- zero(ev);
ev.events = 0;
ev.data.u32 = FD_OTHER_BASE + s->fifo_fd;
static const char* const session_class_table[_SESSION_CLASS_MAX] = {
[SESSION_USER] = "user",
[SESSION_GREETER] = "greeter",
- [SESSION_LOCK_SCREEN] = "lock-screen"
+ [SESSION_LOCK_SCREEN] = "lock-screen",
+ [SESSION_BACKGROUND] = "background"
};
DEFINE_STRING_TABLE_LOOKUP(session_class, SessionClass);