summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nspawn/nspawn.c2
-rw-r--r--src/shared/cgroup-util.c6
-rw-r--r--src/test/test-cgroup-util.c40
3 files changed, 46 insertions, 2 deletions
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;
}