X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fcgroup-util.c;h=309f65d03eefc0cff9c046db035883565b9fdcc9;hb=0371ca0dac1d70b2e5060a3c4e6fbbc2bdbd8671;hp=4e0211a7a04758c12c292064020c476972b81509;hpb=9588bc32096fc8342bfd8b989689717186d7d86e;p=elogind.git diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 4e0211a7a..309f65d03 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -480,7 +480,7 @@ static int join_path(const char *controller, const char *path, const char *suffi int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) { const char *p; - static __thread bool good = false; + static thread_local bool good = false; assert(fs); @@ -1082,42 +1082,42 @@ int cg_get_root_path(char **path) { return 0; } -int cg_pid_get_path_shifted(pid_t pid, char **root, char **cgroup) { +int cg_pid_get_path_shifted(pid_t pid, const char *root, char **cgroup) { _cleanup_free_ char *cg_root = NULL; char *cg_process, *p; int r; - r = cg_get_root_path(&cg_root); - if (r < 0) - return r; + assert(pid >= 0); + assert(cgroup); + + if (!root) { + /* If the root was specified let's use that, otherwise + * let's determine it from PID 1 */ + + r = cg_get_root_path(&cg_root); + if (r < 0) + return r; + + root = cg_root; + } r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process); if (r < 0) return r; - p = path_startswith(cg_process, cg_root); - if (p) - p--; - else - p = cg_process; + p = path_startswith(cg_process, root); + if (p) { + char *c; - if (cgroup) { - char* c; + c = strdup(p - 1); + free(cg_process); - c = strdup(p); - if (!c) { - free(cg_process); + if (!c) return -ENOMEM; - } *cgroup = c; - } - - if (root) { - cg_process[p-cg_process] = 0; - *root = cg_process; } else - free(cg_process); + *cgroup = cg_process; return 0; } @@ -1337,36 +1337,41 @@ int cg_pid_get_session(pid_t pid, char **session) { int cg_path_get_owner_uid(const char *path, uid_t *uid) { _cleanup_free_ char *slice = NULL; - const char *e; + const char *start, *end; char *s; + uid_t u; int r; assert(path); - assert(uid); r = cg_path_get_slice(path, &slice); if (r < 0) return r; - e = startswith(slice, "user-"); - if (!e) + start = startswith(slice, "user-"); + if (!start) return -ENOENT; - if (!endswith(slice, ".slice")) + end = endswith(slice, ".slice"); + if (!end) return -ENOENT; - s = strndupa(e, strlen(e) - 6); + s = strndupa(start, end - start); if (!s) - return -ENOMEM; + return -ENOENT; + + if (parse_uid(s, &u) < 0) + return -EIO; - return parse_uid(s, uid); + if (uid) + *uid = u; + + return 0; } int cg_pid_get_owner_uid(pid_t pid, uid_t *uid) { _cleanup_free_ char *cgroup = NULL; int r; - assert(uid); - r = cg_pid_get_path_shifted(pid, NULL, &cgroup); if (r < 0) return r;