]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Enable get_cgroup_mount to search for mount points satisfying multiple subsystems...
authorChristian Seiler <christian@iwakd.de>
Thu, 23 Feb 2012 08:57:13 +0000 (09:57 +0100)
committerDaniel Lezcano <daniel.lezcano@free.fr>
Thu, 23 Feb 2012 08:57:13 +0000 (09:57 +0100)
lxc-attach functionality reads /proc/init_pid/cgroup to determine the cgroup
of the container for a given subsystem. However, since subsystems may be
mounted together, we want to be on the safe side and be sure that we really
find the correct mount point, so we allow get_cgroup_mount to check for
*all* the subsystems; the subsystem parameter may now be a comma-separated
list.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/cgroup.c

index 6ae67bd0dbdb4c178aa9ba37520b2520233d2850..2e04c791059fd6adbe83b1600f14d83d2ff073e4 100644 (file)
@@ -52,6 +52,35 @@ enum {
        CGROUP_CLONE_CHILDREN,
 };
 
+static char *hasmntopt_multiple(struct mntent *mntent, const char *options)
+{
+       const char *ptr = options;
+       const char *ptr2 = strchr(options, ',');
+       char *result;
+
+       while (ptr2 != NULL) {
+               char *option = strndup(ptr, ptr2 - ptr);
+               if (!option) {
+                       SYSERROR("Temporary memory allocation error");
+                       return NULL;
+               }
+
+               result = hasmntopt(mntent, option);
+               free(option);
+
+               if (!result) {
+                       return NULL;
+               }
+
+               ptr = ptr2 + 1;
+               ptr2 = strchr(ptr, ',');
+       }
+
+       /* for multiple mount options, the return value is basically NULL
+        * or non-NULL, so this should suffice for our purposes */
+       return hasmntopt(mntent, ptr);
+}
+
 static int get_cgroup_mount(const char *subsystem, char *mnt)
 {
        struct mntent *mntent;
@@ -67,7 +96,7 @@ static int get_cgroup_mount(const char *subsystem, char *mnt)
 
                if (strcmp(mntent->mnt_type, "cgroup"))
                        continue;
-               if (!subsystem || hasmntopt(mntent, subsystem)) {
+               if (!subsystem || hasmntopt_multiple(mntent, subsystem)) {
                        strcpy(mnt, mntent->mnt_dir);
                        fclose(file);
                        DEBUG("using cgroup mounted at '%s'", mnt);