diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 0a5a151202..1e7df38c16 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -1298,7 +1298,7 @@ int main(int argc, char *argv[]) { goto finish; } - newcg = strjoin(machine_root, "/", arg_machine, NULL); + newcg = strjoin(machine_root, "/", arg_machine, ".nspawn", NULL); if (!newcg) { log_error("Failed to allocate cgroup path."); goto finish; diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 5d44342bbe..e54b94658c 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -1320,7 +1320,7 @@ int cg_pid_get_user_unit(pid_t pid, char **unit) { int cg_path_get_machine_name(const char *path, char **machine) { const char *e, *n; - char *s; + char *s, *dot; assert(path); assert(machine); @@ -1337,6 +1337,10 @@ int cg_path_get_machine_name(const char *path, char **machine) { if (!s) return -ENOMEM; + dot = strrchr(s, '.'); + if (dot) + *dot = 0; + *machine = s; return 0; } diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c index 5eaa129418..f632df11eb 100644 --- a/src/test/test-cgroup-util.c +++ b/src/test/test-cgroup-util.c @@ -89,11 +89,51 @@ static void test_get_paths(void) { log_info("Machine = %s", d); } +static void test_proc(void) { + _cleanup_closedir_ DIR *d = NULL; + struct dirent *de; + int r; + + d = opendir("/proc"); + assert_se(d); + + FOREACH_DIRENT(de, d, break) { + _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL; + pid_t pid; + + if (de->d_type != DT_DIR && + de->d_type != DT_UNKNOWN) + continue; + + r = parse_pid(de->d_name, &pid); + if (r < 0) + continue; + + cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path); + cg_pid_get_path_shifted(pid, &prefix, &path_shifted); + cg_pid_get_session(pid, &session); + cg_pid_get_unit(pid, &unit); + cg_pid_get_user_unit(pid, &user_unit); + cg_pid_get_machine_name(pid, &machine); + + printf("%lu\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", + (unsigned long) pid, + path, + prefix, + path_shifted, + session, + unit, + user_unit, + machine); + } +} + int main(void) { test_path_decode_unit(); test_path_get_unit(); test_path_get_user_unit(); test_get_paths(); + test_proc(); return 0; }