]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
libcgroup: Add an API to allow comparision of cgroups
authorDhaval Giani <dhaval@linux.vnet.ibm.com>
Tue, 12 Aug 2008 08:13:02 +0000 (08:13 +0000)
committerDhaval Giani <dhaval@linux.vnet.ibm.com>
Tue, 12 Aug 2008 08:13:02 +0000 (08:13 +0000)
Allows you to compare two cgroups. Their values need to be
equal. NULL cgroups are invalid.

Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@124 4f4bb910-9a46-0410-90c8-c897d4f1cd53

libcgroup.h
wrapper.c

index 89f923ae67091dc2013048927dbefd7b47b40db0..508fe48617b554ff14bebdc12f45df88fd7e436d 100644 (file)
@@ -122,6 +122,8 @@ enum cgroup_errors {
         * users need to check errno upon encoutering ECGOTHER.
         */
        ECGOTHER,
+       ECGROUPNOTEQUAL,
+       ECGCONTROLLERNOTEQUAL,
 };
 
 #define CG_MAX_MSG_SIZE                256
@@ -181,6 +183,9 @@ int cgroup_add_value_uint64(struct cgroup_controller *controller,
                                const char *name, u_int64_t value);
 int cgroup_add_value_bool(struct cgroup_controller *controller,
                                const char *name, bool value);
+int cgroup_compare_cgroup(struct cgroup *cgroup_a, struct cgroup *cgroup_b);
+int cgroup_compare_controllers(struct cgroup_controller *cgca,
+                                       struct cgroup_controller *cgcb);
 
 __END_DECLS
 
index f79f58f351d278e2876c706e92e78bc77af9c264..5aaabe74d8916fcfaff5e80313958beb16c278ca 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -229,3 +229,65 @@ int cgroup_add_value_bool(struct cgroup_controller *controller,
 
        return 0;
 }
+
+int cgroup_compare_controllers(struct cgroup_controller *cgca,
+                                       struct cgroup_controller *cgcb)
+{
+       int i;
+
+       if (!cgca || !cgcb)
+               return ECGINVAL;
+
+       if (strcmp(cgca->name, cgcb->name))
+               return ECGCONTROLLERNOTEQUAL;
+
+       if (cgca->index != cgcb->index)
+               return ECGCONTROLLERNOTEQUAL;
+
+       for (i = 0; i < cgca->index; i++) {
+               struct control_value *cva = cgca->values[i];
+               struct control_value *cvb = cgcb->values[i];
+
+               if (strcmp(cva->name, cvb->name))
+                       return ECGCONTROLLERNOTEQUAL;
+
+               if (strcmp(cva->value, cvb->value))
+                       return ECGCONTROLLERNOTEQUAL;
+       }
+       return 0;
+}
+
+int cgroup_compare_cgroup(struct cgroup *cgroup_a, struct cgroup *cgroup_b)
+{
+       int i;
+
+       if (!cgroup_a || !cgroup_b)
+               return ECGINVAL;
+
+       if (strcmp(cgroup_a->name, cgroup_b->name))
+               return ECGROUPNOTEQUAL;
+
+       if (cgroup_a->tasks_uid != cgroup_b->tasks_uid)
+               return ECGROUPNOTEQUAL;
+
+       if (cgroup_a->tasks_gid != cgroup_b->tasks_gid)
+               return ECGROUPNOTEQUAL;
+
+       if (cgroup_a->control_uid != cgroup_b->control_uid)
+               return ECGROUPNOTEQUAL;
+
+       if (cgroup_a->control_gid != cgroup_b->control_gid)
+               return ECGROUPNOTEQUAL;
+
+       if (cgroup_a->index != cgroup_b->index)
+               return ECGROUPNOTEQUAL;
+
+       for (i = 0; i < cgroup_a->index; i++) {
+               struct cgroup_controller *cgca = cgroup_a->controller[i];
+               struct cgroup_controller *cgcb = cgroup_b->controller[i];
+
+               if (cgroup_compare_controllers(cgca, cgcb))
+                       return ECGCONTROLLERNOTEQUAL;
+       }
+       return 0;
+}