From dbd821acb4d91181b309860bb4d4b711b38da7b4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 12 Jul 2010 03:15:20 +0200 Subject: [PATCH] cgroup: implement cg_get_path natively --- src/cgroup-util.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/cgroup-util.c b/src/cgroup-util.c index 0b8678c01..e38d6f5c1 100644 --- a/src/cgroup-util.c +++ b/src/cgroup-util.c @@ -37,7 +37,6 @@ Currently, the only remaining functionality from libcgroup we call here is: - - cgroup_get_subsys_mount_point() - cgroup_walk_tree_begin()/cgroup_walk_tree_next() - cgroup_delete_cgroup_ext() */ @@ -409,13 +408,33 @@ int cg_migrate_recursive(const char *controller, const char *from, const char *t } int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) { + const char *p; char *mp; int r; assert(controller); + assert(fs); + + /* This is a very minimal lookup from controller names to + * paths. Since we have mounted most hierarchies ourselves + * should be kinda safe, but eventually we might want to + * extend this to have a fallback to actually check + * /proc/mounts. Might need caching then. */ + + if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) + p = "systemd"; + else if (startswith(controller, "name=")) + p = controller + 5; + else + p = controller; + + if (asprintf(&mp, "/cgroup/%s", p) < 0) + return -ENOMEM; - if ((r = cgroup_get_subsys_mount_point(controller, &mp)) != 0) - return cg_translate_error(r, errno); + if ((r = path_is_mount_point(mp)) <= 0) { + free(mp); + return r < 0 ? r : -ENOENT; + } if (path && suffix) r = asprintf(fs, "%s/%s/%s", mp, path, suffix); -- 2.30.2