summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorDhaval Giani <dhaval@linux.vnet.ibm.com>2009-02-28 09:27:31 +0000
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2009-02-28 09:27:31 +0000
commitbcf5c9ac11e899311ba0f3ba1b551ec62b8602cc (patch)
tree85862610bfa8b91d6c0639973a61fd46945a3ab7 /tests
parent1b17475ed4300d050cc87334898908f444881af5 (diff)
downloadlibcg-bcf5c9ac11e899311ba0f3ba1b551ec62b8602cc.tar.gz
libcg-bcf5c9ac11e899311ba0f3ba1b551ec62b8602cc.tar.xz
libcg-bcf5c9ac11e899311ba0f3ba1b551ec62b8602cc.zip
Feature: Provide new libcgroup walk tree API
From: Balbir Singh <balbir@linux.vnet.ibm.com> Changelog v3..v4 1. Add _end() method for the iterator Changelog v3..v2 1. Move to iterator based design Changelog v2..v1 1. Add base path and depth semantics for walking This patch adds the capability to walk cgroups by providing a new API called cgroup_walk_tree. The API accepts the controller to walk and the order in which the directories and files must be visited. The code is implemented as an iterator, the begin function starts the walk and we have depth control. The next function gets the following node and returns ECGEOF when done. libcgroup.map has been updated to reflect the same change and the prototype is exported in libcgroup.h. I've also added test cases (tests/walk_test.c). Sample output is show root is /cgroup/cpu/// path , parent , relative /, full /cgroup/cpu/// path l3, parent , relative /l3, full /cgroup/cpu///l3 path ll1, parent l3, relative /l3/ll1, full /cgroup/cpu///l3/ll1 path lll1, parent ll1, relative /l3/ll1/lll1, full /cgroup/cpu///l3/ll1/lll1 path l2, parent , relative /l2, full /cgroup/cpu///l2 path ll1, parent l2, relative /l2/ll1, full /cgroup/cpu///l2/ll1 path lll1, parent ll1, relative /l2/ll1/lll1, full /cgroup/cpu///l2/ll1/lll1 path l1, parent , relative /l1, full /cgroup/cpu///l1 path ll1, parent l1, relative /l1/ll1, full /cgroup/cpu///l1/ll1 path lll1, parent ll1, relative /l1/ll1/lll1, full /cgroup/cpu///l1/ll1/lll1 path a, parent , relative /a, full /cgroup/cpu///a path e, parent a, relative /a/e, full /cgroup/cpu///a/e path f, parent e, relative /a/e/f, full /cgroup/cpu///a/e/f path f, parent a, relative /a/f, full /cgroup/cpu///a/f path x, parent a, relative /a/x, full /cgroup/cpu///a/x path b, parent a, relative /a/b, full /cgroup/cpu///a/b path c, parent b, relative /a/b/c, full /cgroup/cpu///a/b/c path d, parent c, relative /a/b/c/d, full /cgroup/cpu///a/b/c/d path default, parent , relative /default, full /cgroup/cpu///default root is /cgroup/cpu//a/ path , parent , relative /, full /cgroup/cpu//a/ path e, parent , relative /e, full /cgroup/cpu//a/e path f, parent e, relative /e/f, full /cgroup/cpu//a/e/f path f, parent , relative /f, full /cgroup/cpu//a/f path x, parent , relative /x, full /cgroup/cpu//a/x path b, parent , relative /b, full /cgroup/cpu//a/b path c, parent b, relative /b/c, full /cgroup/cpu//a/b/c Walking the first 5 nodes root is /cgroup/cpu/// path , parent , relative /, full /cgroup/cpu/// path l3, parent , relative /l3, full /cgroup/cpu///l3 path ll1, parent l3, relative /l3/ll1, full /cgroup/cpu///l3/ll1 path lll1, parent ll1, relative /l3/ll1/lll1, full /cgroup/cpu///l3/ll1/lll1 NOTE: Parent directory is represented by an empty (not NULL) string "". The length of the string is 0. Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com> Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com> git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@356 4f4bb910-9a46-0410-90c8-c897d4f1cd53
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile6
-rw-r--r--tests/walk_test.c90
2 files changed, 95 insertions, 1 deletions
diff --git a/tests/Makefile b/tests/Makefile
index 00bfe3d..9ebadac 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -8,7 +8,8 @@ TARGET= libtest_functions.a \
libcgrouptest01 \
libcg_ba \
setuid \
- pathtest
+ pathtest \
+ walk_test
all: $(TARGET)
@@ -30,5 +31,8 @@ setuid: setuid.c
pathtest: pathtest.c
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LIBS)
+walk_test: walk_test.c
+ $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LIBS)
+
clean:
\rm -f $(TARGET) test_functions.o
diff --git a/tests/walk_test.c b/tests/walk_test.c
new file mode 100644
index 0000000..2e16ecd
--- /dev/null
+++ b/tests/walk_test.c
@@ -0,0 +1,90 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <libcgroup.h>
+
+void visit_node(struct cgroup_file_info *info, char *root)
+{
+ if (info->type == CGROUP_FILE_TYPE_DIR) {
+ printf("path %s, parent %s, relative %s, full %s\n",
+ info->path, info->parent, info->full_path +
+ + strlen(root) - 1,
+ info->full_path);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int ret;
+ char *controller;
+ void *handle;
+ struct cgroup_file_info info;
+ char root[FILENAME_MAX];
+ int lvl, i;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage %s: <controller name>\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ controller = argv[1];
+
+ cgroup_init();
+
+ ret = cgroup_walk_tree_begin(controller, "/", 0, &handle, &info, &lvl);
+
+ if (ret != 0) {
+ fprintf(stderr, "Walk failed\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(root, info.full_path);
+ printf("root is %s\n", root);
+ visit_node(&info, root);
+ while ((ret = cgroup_walk_tree_next(0, &handle, &info, lvl)) !=
+ ECGEOF) {
+ visit_node(&info, root);
+ }
+ cgroup_walk_tree_end(&handle);
+
+ ret = cgroup_walk_tree_begin(controller, "/a", 2, &handle, &info, &lvl);
+
+ if (ret != 0) {
+ fprintf(stderr, "Walk failed\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(root, info.full_path);
+ printf("root is %s\n", root);
+ visit_node(&info, root);
+ while ((ret = cgroup_walk_tree_next(2, &handle, &info, lvl)) !=
+ ECGEOF) {
+ visit_node(&info, root);
+ }
+ cgroup_walk_tree_end(&handle);
+
+ /*
+ * Walk only the first five nodes
+ */
+ i = 0;
+ printf("Walking the first 5 nodes\n");
+ ret = cgroup_walk_tree_begin(controller, "/", 0, &handle, &info, &lvl);
+
+ if (ret != 0) {
+ fprintf(stderr, "Walk failed\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(root, info.full_path);
+ printf("root is %s\n", root);
+ visit_node(&info, root);
+ i++;
+ while ((ret = cgroup_walk_tree_next(0, &handle, &info, lvl)) !=
+ ECGEOF) {
+ visit_node(&info, root);
+ if (++i >= 5)
+ break;
+ }
+ cgroup_walk_tree_end(&handle);
+ return EXIT_SUCCESS;
+}