X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-user.c;h=9e2cbf646b28ca09a6a79527a2dfd22064d3abee;hb=602c0e740f8290cc9c4f13f2eb4b23fbbd7a8d2b;hp=a33978c188cc33d3bfe4019fcb1542041355240f;hpb=c9caad802128a5dc599342c1400a61f31e8b17b5;p=elogind.git diff --git a/src/login/logind-user.c b/src/login/logind-user.c index a33978c18..9e2cbf646 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -29,6 +29,7 @@ #include "cgroup-util.h" #include "hashmap.h" #include "strv.h" +#include "fileio.h" User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name) { User *u; @@ -180,6 +181,20 @@ int user_save(User *u) { fputs(i->id, f); } + fputs("\nONLINE_SESSIONS=", f); + first = true; + LIST_FOREACH(sessions_by_user, i, u->sessions) { + if (session_get_state(i) == SESSION_CLOSING) + continue; + + if (first) + first = false; + else + fputc(' ', f); + + fputs(i->id, f); + } + fputs("\nACTIVE_SEATS=", f); first = true; LIST_FOREACH(sessions_by_user, i, u->sessions) { @@ -189,7 +204,23 @@ int user_save(User *u) { if (first) first = false; else - fputs(i->seat->id, f); + fputc(' ', f); + + fputs(i->seat->id, f); + } + + fputs("\nONLINE_SEATS=", f); + first = true; + LIST_FOREACH(sessions_by_user, i, u->sessions) { + if (session_get_state(i) == SESSION_CLOSING || !i->seat) + continue; + + if (first) + first = false; + else + fputc(' ', f); + + fputs(i->seat->id, f); } fputc('\n', f); } @@ -284,12 +315,22 @@ static int user_create_cgroup(User *u) { assert(u); if (!u->cgroup_path) { - if (asprintf(&p, "%s/%s", u->manager->cgroup_path, u->name) < 0) + _cleanup_free_ char *name = NULL, *escaped = NULL; + + if (asprintf(&name, "%lu.user", (unsigned long) u->uid) < 0) + return log_oom(); + + escaped = cg_escape(name); + if (!escaped) + return log_oom(); + + p = strjoin(u->manager->cgroup_path, "/", escaped, NULL); + if (!p) return log_oom(); } else p = u->cgroup_path; - r = cg_create(SYSTEMD_CGROUP_CONTROLLER, p); + r = cg_create(SYSTEMD_CGROUP_CONTROLLER, p, NULL); if (r < 0) { log_error("Failed to create cgroup "SYSTEMD_CGROUP_CONTROLLER":%s: %s", p, strerror(-r)); free(p); @@ -304,12 +345,14 @@ static int user_create_cgroup(User *u) { if (strv_contains(u->manager->reset_controllers, *k)) continue; - r = cg_create(*k, p); + r = cg_create(*k, p, NULL); if (r < 0) log_warning("Failed to create cgroup %s:%s: %s", *k, p, strerror(-r)); } - hashmap_put(u->manager->user_cgroups, u->cgroup_path, u); + r = hashmap_put(u->manager->user_cgroups, u->cgroup_path, u); + if (r < 0) + log_warning("Failed to create mapping between cgroup and user"); return 0; }