chiark / gitweb /
cgroup: implement cg_get_path natively
[elogind.git] / src / cgroup-util.c
index 0b8678c0128ab4c8592c5f6fe3a6f6443fd39051..e38d6f5c1036b0f2dc8d34ed5c0cc555e1f938af 100644 (file)
@@ -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);