X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fcgroup-util.c;h=e6ceb99454b8460408c64f9797b0ed884e04624c;hb=6e8314c420eb375847c9e526745c2caec802399d;hp=74889b636324dea71c0426e05740198a5f21286b;hpb=d4fffc4b8beb86e77fd710c1f43913a490ed083a;p=elogind.git diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 74889b636..e6ceb9945 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -194,12 +194,12 @@ int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo if (kill(pid, sig) < 0) { if (ret >= 0 && errno != ESRCH) ret = -errno; - } else if (ret == 0) { - + } else { if (sigcont) kill(pid, SIGCONT); - ret = 1; + if (ret == 0) + ret = 1; } done = false; @@ -746,10 +746,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { } else controller = SYSTEMD_CGROUP_CONTROLLER; - if (pid == 0) - fs = "/proc/self/cgroup"; - else - fs = procfs_file_alloca(pid, "cgroup"); + fs = procfs_file_alloca(pid, "cgroup"); f = fopen(fs, "re"); if (!f) @@ -1082,42 +1079,62 @@ int cg_get_root_path(char **path) { return 0; } -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 cg_shift_path(const char *cgroup, const char *root, const char **shifted) { + _cleanup_free_ char *rt = NULL; + char *p; int r; - assert(pid >= 0); assert(cgroup); + assert(shifted); 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); + r = cg_get_root_path(&rt); if (r < 0) return r; - root = cg_root; + root = rt; } - r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process); + p = path_startswith(cgroup, root); + if (p) + *shifted = p - 1; + else + *shifted = cgroup; + + return 0; +} + +int cg_pid_get_path_shifted(pid_t pid, const char *root, char **cgroup) { + _cleanup_free_ char *raw = NULL; + const char *c; + int r; + + assert(pid >= 0); + assert(cgroup); + + r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &raw); if (r < 0) return r; - p = path_startswith(cg_process, root); - if (p) { - char *c; + r = cg_shift_path(raw, root, &c); + if (r < 0) + return r; - c = strdup(p - 1); - free(cg_process); + if (c == raw) { + *cgroup = raw; + raw = NULL; + } else { + char *n; - if (!c) + n = strdup(c); + if (!n) return -ENOMEM; - *cgroup = c; - } else - *cgroup = cg_process; + *cgroup = n; + } return 0; } @@ -1132,7 +1149,7 @@ int cg_path_decode_unit(const char *cgroup, char **unit){ c = strndupa(cgroup, e - cgroup); c = cg_unescape(c); - if (!unit_name_is_valid(c, false)) + if (!unit_name_is_valid(c, TEMPLATE_INVALID)) return -EINVAL; s = strdup(c); @@ -1315,11 +1332,10 @@ int cg_pid_get_machine_name(pid_t pid, char **machine) { int cg_path_get_session(const char *path, char **session) { const char *e, *n, *x; - char *s, *r; + char *s; size_t l; assert(path); - assert(session); /* Skip slices, if there are any */ e = skip_slices(path); @@ -1341,11 +1357,16 @@ int cg_path_get_session(const char *path, char **session) { if (l <= 6) return -ENOENT; - r = strndup(x, l - 6); - if (!r) - return -ENOMEM; + if (session) { + char *r; + + r = strndup(x, l - 6); + if (!r) + return -ENOMEM; + + *session = r; + } - *session = r; return 0; } @@ -1353,8 +1374,6 @@ int cg_pid_get_session(pid_t pid, char **session) { _cleanup_free_ char *cgroup = NULL; int r; - assert(session); - r = cg_pid_get_path_shifted(pid, NULL, &cgroup); if (r < 0) return r; @@ -1546,7 +1565,7 @@ int cg_slice_to_path(const char *unit, char **ret) { assert(unit); assert(ret); - if (!unit_name_is_valid(unit, false)) + if (!unit_name_is_valid(unit, TEMPLATE_INVALID)) return -EINVAL; if (!endswith(unit, ".slice")) @@ -1563,7 +1582,7 @@ int cg_slice_to_path(const char *unit, char **ret) { strcpy(stpncpy(n, p, dash - p), ".slice"); - if (!unit_name_is_valid(n, false)) + if (!unit_name_is_valid(n, TEMPLATE_INVALID)) return -EINVAL; escaped = cg_escape(n);