diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-22 23:10:13 -0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-22 23:14:12 -0300 |
commit | ae018d9bc900d6355dea4af05119b49c67945184 (patch) | |
tree | 07a311ae16ac331f1044503bbb01a4e111331fb2 /src/test | |
parent | cd8f53ab1601513cc3407447bfe3359ee7139676 (diff) |
cgroup: make sure all our cgroup objects have a suffix and are properly escaped
Session objects will now get the .session suffix, user objects the .user
suffix, nspawn containers the .nspawn suffix.
This also changes the user cgroups to be named after the numeric UID
rather than the username, since this allows us the parse these paths
standalone without requiring access to the cgroup file system.
This also changes the mapping of instanced units to cgroups. Instead of
mapping foo@bar.service to the cgroup path /user/foo@.service/bar we
will now map it to /user/foo@.service/foo@bar.service, in order to
ensure that all our objects are properly suffixed in the tree.
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/test-cgroup-util.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c index f632df11eb..95cede7a22 100644 --- a/src/test/test-cgroup-util.c +++ b/src/test/test-cgroup-util.c @@ -32,8 +32,8 @@ static void check_p_d_u(const char *path, int code, const char *result) { } static void test_path_decode_unit(void) { - check_p_d_u("getty@.service/tty2", 0, "getty@tty2.service"); - check_p_d_u("getty@.service/tty2/xxx", 0, "getty@tty2.service"); + check_p_d_u("getty@.service/getty@tty2.service", 0, "getty@tty2.service"); + check_p_d_u("getty@.service/getty@tty2.service/xxx", 0, "getty@tty2.service"); check_p_d_u("getty@.service/", -EINVAL, NULL); check_p_d_u("getty@.service", -EINVAL, NULL); check_p_d_u("getty.service", 0, "getty.service"); @@ -56,9 +56,9 @@ static void check_p_g_u_u(const char *path, int code, const char *result) { static void test_path_get_unit(void) { check_p_g_u("/system/foobar.service/sdfdsaf", 0, "foobar.service"); - check_p_g_u("/system/getty@.service/tty5", 0, "getty@tty5.service"); - check_p_g_u("/system/getty@.service/tty5/aaa/bbb", 0, "getty@tty5.service"); - check_p_g_u("/system/getty@.service/tty5/", 0, "getty@tty5.service"); + check_p_g_u("/system/getty@.service/getty@tty5.service", 0, "getty@tty5.service"); + check_p_g_u("/system/getty@.service/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service"); + check_p_g_u("/system/getty@.service/getty@tty5.service/", 0, "getty@tty5.service"); check_p_g_u("/system/getty@tty6.service/tty5", 0, "getty@tty6.service"); check_p_g_u("sadfdsafsda", -ENOENT, NULL); check_p_g_u("/system/getty####@tty6.service/tty5", -EINVAL, NULL); @@ -70,7 +70,7 @@ static void test_path_get_user_unit(void) { check_p_g_u_u("/user/lennart/2/systemd-21548/foobar.service/waldo/uuuux", 0, "foobar.service"); check_p_g_u_u("/user/lennart/2/systemd-21548/waldo/waldo/uuuux", -EINVAL, NULL); check_p_g_u_u("/user/lennart/2/foobar.service", -ENOENT, NULL); - check_p_g_u_u("/user/lennart/2/systemd-21548/foobar@.service/pie/pa/po", 0, "foobar@pie.service"); + check_p_g_u_u("/user/lennart/2/systemd-21548/foobar@.service/foobar@pie.service/pa/po", 0, "foobar@pie.service"); } static void test_get_paths(void) { @@ -100,6 +100,7 @@ static void test_proc(void) { 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; + uid_t uid = (uid_t) -1; if (de->d_type != DT_DIR && de->d_type != DT_UNKNOWN) @@ -109,18 +110,23 @@ static void test_proc(void) { if (r < 0) continue; + if (is_kernel_thread(pid)) + continue; + cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path); cg_pid_get_path_shifted(pid, &prefix, &path_shifted); + cg_pid_get_owner_uid(pid, &uid); 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", + printf("%lu\t%s\t%s\t%s\t%lu\t%s\t%s\t%s\t%s\n", (unsigned long) pid, path, prefix, path_shifted, + (unsigned long) uid, session, unit, user_unit, @@ -128,12 +134,32 @@ static void test_proc(void) { } } +static void test_escape_one(const char *s, const char *r) { + _cleanup_free_ char *b; + + b = cg_escape(s); + assert_se(b); + assert_se(streq(b, r)); + + assert_se(streq(cg_unescape(b), s)); +} + +static void test_escape(void) { + test_escape_one("foobar", "foobar"); + test_escape_one("foobar.service", "foobar.service"); + test_escape_one("cgroup.service", "_cgroup.service"); + test_escape_one("cpu.service", "_cpu.service"); + test_escape_one("tasks", "_tasks"); + test_escape_one("_foobar", "__foobar"); +} + int main(void) { test_path_decode_unit(); test_path_get_unit(); test_path_get_user_unit(); test_get_paths(); test_proc(); + test_escape(); return 0; } |