]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
libcgroup: Add cgroup_?et_value_* APIs
authorDhaval Giani <dhaval@linux.vnet.ibm.com>
Tue, 12 Aug 2008 08:19:24 +0000 (08:19 +0000)
committerDhaval Giani <dhaval@linux.vnet.ibm.com>
Tue, 12 Aug 2008 08:19:24 +0000 (08:19 +0000)
Adding in APIs which allow you to set and get values from a cgroup
controller. Use cgroup_get_controller to get a controller, and then
use cgroup_?et_value_* API for your requirement.

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

libcgroup.h
wrapper.c

index 80cdfa0d0ebc418f411d3c4d673cf81049e60930..5252c7f920fb15199bd4c510f7aed801d871e86b 100644 (file)
@@ -189,6 +189,22 @@ int cgroup_set_uid_gid(struct cgroup *cgroup, uid_t tasks_uid, gid_t tasks_gid,
                                        uid_t control_uid, gid_t control_gid);
 int cgroup_get_uid_gid(struct cgroup *cgroup, uid_t *tasks_uid,
                gid_t *tasks_gid, uid_t *control_uid, gid_t *control_gid);
+int cgroup_get_value_string(struct cgroup_controller *controller,
+                                       const char *name, char **value);
+int cgroup_set_value_string(struct cgroup_controller *controller,
+                                       const char *name, const char *value);
+int cgroup_get_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t *value);
+int cgroup_set_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t value);
+int cgroup_get_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t *value);
+int cgroup_set_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t value);
+int cgroup_get_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool *value);
+int cgroup_set_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool value);
 
 __END_DECLS
 
index 62c257f811615a63ce1afa9e8aebb2310ea3910f..392bc6773da2c69091877c48af74c28a92334c5a 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -17,6 +17,7 @@
 
 #include <libcgroup.h>
 #include <libcgroup-internal.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -313,3 +314,196 @@ int cgroup_get_uid_gid(struct cgroup *cgroup, uid_t *tasks_uid,
 
        return 0;
 }
+
+struct cgroup_controller *cgroup_get_controller(struct cgroup *cgroup,
+                                                       const char *name)
+{
+       int i;
+       struct cgroup_controller *cgc;
+
+       for (i = 0; i < cgroup->index; i++) {
+               cgc = cgroup->controller[i];
+
+               if (!strcmp(cgc->name, name))
+                       return cgc;
+       }
+
+       return NULL;
+}
+
+int cgroup_get_value_string(struct cgroup_controller *controller,
+                                       const char *name, char **value)
+{
+       int i;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+                       *value = strdup(val->value);
+
+                       if (!*value)
+                               return ECGOTHER;
+
+                       return 0;
+               }
+       }
+
+       return ECGROUPVALUENOTEXIST;
+
+}
+
+int cgroup_set_value_string(struct cgroup_controller *controller,
+                                       const char *name, const char *value)
+{
+       int i;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+               if (!strcmp(val->name, name)) {
+                       strncpy(val->value, value, CG_VALUE_MAX);
+                       return 0;
+               }
+       }
+
+       return cgroup_add_value_string(controller, name, value);
+}
+
+int cgroup_get_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t *value)
+{
+       int i;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+
+                       if (sscanf(val->value, "%ld", value) != 1)
+                               return ECGINVAL;
+
+                       return 0;
+               }
+       }
+
+       return ECGROUPVALUENOTEXIST;
+}
+
+int cgroup_set_value_int64(struct cgroup_controller *controller,
+                                       const char *name, int64_t value)
+{
+       int i;
+       unsigned ret;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+                       ret = snprintf(val->value,
+                               sizeof(val->value), "%lu", value);
+
+                       if (ret >= sizeof(val->value) || ret < 0)
+                               return ECGINVAL;
+
+                       return 0;
+               }
+       }
+
+       return cgroup_add_value_int64(controller, name, value);
+}
+
+int cgroup_get_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t *value)
+{
+       int i;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+               if (!strcmp(val->name, name)) {
+
+                       if (sscanf(val->value, "%lu", value) != 1)
+                               return ECGINVAL;
+
+                       return 0;
+               }
+       }
+
+       return ECGROUPVALUENOTEXIST;
+}
+
+int cgroup_set_value_uint64(struct cgroup_controller *controller,
+                                       const char *name, u_int64_t value)
+{
+       int i;
+       unsigned ret;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+                       ret = snprintf(val->value,
+                               sizeof(val->value), "%lu", value);
+
+                       if (ret >= sizeof(val->value) || ret < 0)
+                               return ECGINVAL;
+
+                       return 0;
+               }
+       }
+
+       return cgroup_add_value_uint64(controller, name, value);
+}
+
+int cgroup_get_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool *value)
+{
+       int i;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+                       int cgc_val;
+
+                       if (sscanf(val->value, "%d", &cgc_val) != 1)
+                               return ECGINVAL;
+
+                       if (cgc_val)
+                               *value = true;
+                       else
+                               *value = false;
+
+                       return 0;
+               }
+       }
+       return ECGROUPVALUENOTEXIST;
+}
+
+int cgroup_set_value_bool(struct cgroup_controller *controller,
+                                               const char *name, bool value)
+{
+       int i;
+       unsigned ret;
+
+       for (i = 0; i < controller->index; i++) {
+               struct control_value *val = controller->values[i];
+
+               if (!strcmp(val->name, name)) {
+                       if (value) {
+                               ret = snprintf(val->value,
+                                               sizeof(val->value), "1");
+                       } else {
+                               ret = snprintf(val->value,
+                                               sizeof(val->value), "0");
+                       }
+
+                       if (ret >= sizeof(val->value) || ret < 0)
+                               return ECGINVAL;
+
+                       return 0;
+
+               }
+       }
+
+       return cgroup_add_value_bool(controller, name, value);
+}