X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogind-user.c;h=3a677ff707888a9b5c52733ced71e3dbc6fdda8c;hp=4335bf646203cd8af4793c300476d0198701a45b;hb=ff4daf5a348278abed4dbf8afc3c4297b8cb9877;hpb=932e3ee76ea0a9d28902f694ad1873e37532da35 diff --git a/src/logind-user.c b/src/logind-user.c index 4335bf646..3a677ff70 100644 --- a/src/logind-user.c +++ b/src/logind-user.c @@ -246,6 +246,10 @@ static int user_create_cgroup(User *u) { u->cgroup_path = p; STRV_FOREACH(k, u->manager->controllers) { + + if (strv_contains(u->manager->reset_controllers, *k)) + continue; + r = cg_create(*k, p); if (r < 0) log_warning("Failed to create cgroup %s:%s: %s", *k, p, strerror(-r)); @@ -321,7 +325,7 @@ static int user_shall_kill(User *u) { return strv_contains(u->manager->kill_only_users, u->name); } -static int user_kill_cgroup(User *u) { +static int user_terminate_cgroup(User *u) { int r; char **k; @@ -397,7 +401,7 @@ int user_stop(User *u) { r = k; /* Kill cgroup */ - k = user_kill_cgroup(u); + k = user_terminate_cgroup(u); if (k < 0) r = k; @@ -453,13 +457,13 @@ int user_get_idle_hint(User *u, dual_timestamp *t) { return idle_hint; } -int user_check_gc(User *u) { +int user_check_gc(User *u, bool drop_not_started) { int r; char *p; assert(u); - if (!u->started) + if (drop_not_started && !u->started) return 0; if (u->sessions) @@ -511,6 +515,30 @@ UserState user_get_state(User *u) { return USER_ONLINE; } +int user_kill(User *u, int signo) { + int r = 0, q; + Set *pid_set = NULL; + + assert(u); + + if (!u->cgroup_path) + return -ESRCH; + + pid_set = set_new(trivial_hash_func, trivial_compare_func); + if (!pid_set) + return -ENOMEM; + + q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set); + if (q < 0) + if (q != -EAGAIN && q != -ESRCH && q != -ENOENT) + r = q; + + if (pid_set) + set_free(pid_set); + + return r; +} + static const char* const user_state_table[_USER_STATE_MAX] = { [USER_OFFLINE] = "offline", [USER_LINGERING] = "lingering",