This patch does not necessarily need to be accepted, it just provides testing
facility for new cgroup_find_parent.

Especially note the ugly dependence on ../src/tools/tools-common.c :)

Signed-off-by: Jan Safranek <jsafr...@redhat.com>
---

 0 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/include/libcgroup.h b/include/libcgroup.h
index 3d5660c..0942161 100644
--- a/include/libcgroup.h
+++ b/include/libcgroup.h
@@ -364,6 +364,18 @@ int cgroup_get_controller_end(void **handle);
  */
 int cgroup_get_subsys_mount_point(char *controller, char **mount_point);
 
+/**
+ * Find the parent of the specified directory. It returns the parent (the
+ * parent is usually name/.. unless name is a mount point.
+ *
+ * @param cgroup The cgroup.
+ * @param parent Output, name of parent's group (if the group has parent) or
+ *     NULL, if the provided cgroup is the root group and has no parent.
+ *     Caller is responsible for freeing the returned string!
+ * @return 0 on success, >0 on error.
+ */
+int cgroup_find_parent(struct cgroup *cgroup, char **parent);
+
 /* The wrappers for filling libcg structures */
 
 struct cgroup *cgroup_new_cgroup(const char *name);
diff --git a/src/libcgroup.map b/src/libcgroup.map
index aa9d0d2..e66c332 100644
--- a/src/libcgroup.map
+++ b/src/libcgroup.map
@@ -73,4 +73,5 @@ global:
        cgroup_get_procname_from_procfs;
        cgroup_register_unchanged_process;
        cgroup_change_cgroup_flags;
+       cgroup_find_parent;
 } CGROUP_0.33;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 14bcdf3..0157a54 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -2,7 +2,7 @@ INCLUDES = -I$(top_srcdir)/include
 LDADD = $(top_srcdir)/src/.libs/libcgroup.la
 
 # compile the tests, but do not install them
-noinst_PROGRAMS = libcgrouptest01 libcg_ba setuid pathtest walk_test 
read_stats walk_task get_controller get_mount_point proctest
+noinst_PROGRAMS = libcgrouptest01 libcg_ba setuid pathtest walk_test 
read_stats walk_task get_controller get_mount_point proctest test_parent
 
 libcgrouptest01_SOURCES=libcgrouptest01.c test_functions.c libcgrouptest.h
 libcg_ba_SOURCES=libcg_ba.cpp
@@ -14,6 +14,7 @@ walk_task_SOURCES=walk_task.c
 get_controller_SOURCES=get_controller.c
 get_mount_point_SOURCES=get_mount_point.c
 proctest_SOURCES=proctest.c
+test_parent_SOURCES=test_parent.c ../src/tools/tools-common.c 
../src/tools/tools-common.h
 
 EXTRA_DIST = pathtest.sh runlibcgrouptest.sh
 
diff --git a/tests/test_parent.c b/tests/test_parent.c
new file mode 100644
index 0000000..3b16439
--- /dev/null
+++ b/tests/test_parent.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <libcgroup.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+/* Ugly, I know...  */
+#include "../src/tools/tools-common.h"
+
+struct cgroup_group_spec *cgroup_list[CG_HIER_MAX];
+
+int main(int argc, char **argv)
+{
+       int ret;
+       int i, j;
+       char *parent;
+       char controllers[PATH_MAX];
+       struct cgroup *cgroup;
+       struct cgroup_controller *cgc;
+
+       ret = cgroup_init();
+       if (ret) {
+               fprintf(stderr, "cgroup_init failed with %s\n",
+                               cgroup_strerror(ret));
+               exit(1);
+       }
+
+       if (argc < 2) {
+               fprintf(stderr, "at least one argument is expected\n");
+               printf("Usage: %s <controllers>:<group> ... \n",
+                               argv[0]);
+               exit(1);
+       }
+
+       for (i = 1; i < argc; i++) {
+               ret = parse_cgroup_spec(cgroup_list, argv[i]);
+               if (ret) {
+                       fprintf(stderr, "cannot parse %s\n", argv[i]);
+                       exit(1);
+               }
+       }
+
+       for (i = 0; i < CG_HIER_MAX; i++) {
+               if (!cgroup_list[i])
+                       break;
+
+               cgroup = cgroup_new_cgroup(cgroup_list[i]->path);
+               if (cgroup == NULL) {
+                       fprintf(stderr, "cannot create new cgroup for %s\n",
+                                       argv[i]);
+                       exit(1);
+               }
+
+               memset(controllers, 0, sizeof(controllers));
+               for (j = 0; j < CG_CONTROLLER_MAX; j++) {
+                       if (cgroup_list[i]->controllers[j] == NULL)
+                               break;
+                       strncat(controllers, cgroup_list[i]->controllers[j],
+                                       sizeof(controllers) -
+                                       strlen(controllers));
+                       strncat(controllers, ",", sizeof(controllers) -
+                                       strlen(controllers));
+                       cgc = cgroup_add_controller(cgroup,
+                                       cgroup_list[i]->controllers[j]);
+                       if (cgc == NULL) {
+                               fprintf(stderr, "cannot add %s to %s\n",
+                                               cgroup_list[i]->path,
+                                               cgroup_list[i]->controllers[j]);
+                               exit(1);
+                       }
+               }
+               ret = cgroup_find_parent(cgroup, &parent);
+               printf("Parent of %s:%s is: %s (%d)\n", controllers,
+                               cgroup_list[i]->path, parent, ret);
+
+               free(parent);
+               cgroup_free_group_spec(cgroup_list[i]);
+               cgroup_free(&cgroup);
+       }
+       return 0;
+}


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to