static int cg_walk_node(FTS *fts, FTSENT *ent, const int depth,
- struct cgroup_file_info *info)
+ struct cgroup_file_info *info, int dir)
{
int ret = 0;
errno = ent->fts_errno;
break;
case FTS_D:
- info->type = CGROUP_FILE_TYPE_DIR;
+ if (dir & CGROUP_WALK_TYPE_PRE_DIR)
+ info->type = CGROUP_FILE_TYPE_DIR;
break;
case FTS_DC:
case FTS_NSOK:
case FTS_NS:
case FTS_DP:
+ if (dir & CGROUP_WALK_TYPE_POST_DIR)
+ info->type = CGROUP_FILE_TYPE_DIR;
break;
case FTS_F:
info->type = CGROUP_FILE_TYPE_FILE;
return ECGEOF;
if (!base_level && depth)
base_level = ent->fts_level + depth;
- ret = cg_walk_node(entry->fts, ent, base_level, info);
+
+ ret = cg_walk_node(entry->fts, ent, base_level, info, entry->flags);
+
*handle = entry;
return ret;
}
return ECGOTHER;
}
+ entry->flags |= CGROUP_WALK_TYPE_PRE_DIR;
+
*base_level = 0;
cg_path[0] = full_path;
cg_path[1] = NULL;
}
if (!*base_level && depth)
*base_level = ent->fts_level + depth;
- ret = cg_walk_node(entry->fts, ent, *base_level, info);
+
+ ret = cg_walk_node(entry->fts, ent, base_level, info, entry->flags);
+
*handle = entry;
return ret;
}
exit(EXIT_FAILURE);
}
strcpy(root, info.full_path);
+ printf("Begin pre-order walk\n");
printf("root is %s\n", root);
visit_node(&info, root);
while ((ret = cgroup_walk_tree_next(0, &handle, &info, lvl)) !=
}
cgroup_walk_tree_end(&handle);
+ printf("pre-order walk finished\n");
+ ret = cgroup_walk_tree_begin(controller, "/", 0, &handle, &info, &lvl);
+
+ if (ret != 0) {
+ fprintf(stderr, "Walk failed\n");
+ exit(EXIT_FAILURE);
+ }
+
+ ret = cgroup_walk_tree_set_flags(&handle, CGROUP_WALK_TYPE_POST_DIR);
+
+ if (ret) {
+ fprintf(stderr, "Walk failed with %s\n", cgroup_strerror(ret));
+ exit(EXIT_FAILURE);
+ }
+
+ strcpy(root, info.full_path);
+ printf("Begin post-order walk\n");
+ 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);
+ printf("post order walk finished\n");
+
ret = cgroup_walk_tree_begin(controller, "/a", 2, &handle, &info, &lvl);
if (ret != 0) {