Add new iterators, which return all mount points of given hierarchy. The order of the mount points is the same as in /proc/mounts, The first returned mount point is the same as cgroup_get_subsys_mount_point().
Signed-off-by: Jan Safranek <jsafr...@redhat.com> --- include/libcgroup/init.h | 3 ++ include/libcgroup/iterators.h | 34 ++++++++++++++++++++++++ src/api.c | 59 +++++++++++++++++++++++++++++++++++++++++ src/libcgroup.map | 7 +++++ 4 files changed, 103 insertions(+), 0 deletions(-) diff --git a/include/libcgroup/init.h b/include/libcgroup/init.h index 881b830..3709096 100644 --- a/include/libcgroup/init.h +++ b/include/libcgroup/init.h @@ -41,6 +41,9 @@ int cgroup_init(void); /** * Returns path where is mounted given controller. Applications should rely on * @c libcgroup API and not call this function directly. + * Only the first mount point is returned, use + * cgroup_get_subsys_mount_point_begin(), cgroup_get_subsys_mount_point_next() + * and cgroup_get_subsys_mount_point_end() to get all of them. * @param controller Name of the controller * @param mount_point The string where the mount point location is stored. * Please note, the caller must free the mount_point. diff --git a/include/libcgroup/iterators.h b/include/libcgroup/iterators.h index 8ecc53f..c6d453d 100644 --- a/include/libcgroup/iterators.h +++ b/include/libcgroup/iterators.h @@ -387,8 +387,42 @@ int cgroup_get_all_controller_end(void **handle); /** * @} + * + * @name List all mount points of a controller. + * Use following functions to list all mount points of a hierarchy with given + * controller. + */ + +/** + * Read the first mount point of the hierarchy with given controller. + * The first is the same as the mount point returned by + * cgroup_get_subsys_mount_point(). + * @param handle Handle to be used for iteration. + * @param controller Controller name. + * @param path Buffer to fill the path into. The buffer must be at least + * FILENAME_MAX characters long. + */ +int cgroup_get_subsys_mount_point_begin(const char *controller, void **handle, + char *path); +/** + * Read next mount point of the hierarchy with given controller. + * @param handle Handle to be used for iteration. + * @param path Buffer to fill the path into. The buffer must be at least + * FILENAME_MAX characters long. + */ +int cgroup_get_subsys_mount_point_next(void **handle, + char *path); + +/** + * Release the iterator. + */ +int cgroup_get_subsys_mount_point_end(void **handle); + +/** + * @} * @} */ + __END_DECLS #endif /* _LIBCGROUP_ITERATORS_H */ diff --git a/src/api.c b/src/api.c index 0dc135a..dfc70a4 100644 --- a/src/api.c +++ b/src/api.c @@ -3922,3 +3922,62 @@ void cgroup_dictionary_iterator_end(void **handle) *handle = NULL; } +int cgroup_get_subsys_mount_point_begin(const char *controller, void **handle, + char *path) +{ + int i; + + if (!cgroup_initialized) + return ECGROUPNOTINITIALIZED; + if (!handle || !path || !controller) + return ECGINVAL; + + + for (i = 0; cg_mount_table[i].name[0] != '\0'; i++) + if (strcmp(controller, cg_mount_table[i].name) == 0) + break; + + if (cg_mount_table[i].name[0] == '\0') { + /* the controller is not mounted at all */ + *handle = NULL; + *path = '\0'; + return ECGEOF; + } + + /* + * 'handle' is pointer to struct cg_mount_point, which should be + * returned next. + */ + *handle = cg_mount_table[i].mount.next; + strcpy(path, cg_mount_table[i].mount.path); + return 0; +} + +int cgroup_get_subsys_mount_point_next(void **handle, + char *path) +{ + struct cg_mount_point *it; + + if (!cgroup_initialized) + return ECGROUPNOTINITIALIZED; + if (!handle || !path) + return ECGINVAL; + + it = *handle; + if (!it) { + *handle = NULL; + *path = '\0'; + return ECGEOF; + } + + *handle = it->next; + strcpy(path, it->path); + return 0; +} + +int cgroup_get_subsys_mount_point_end(void **handle) +{ + return 0; +} + + diff --git a/src/libcgroup.map b/src/libcgroup.map index 2a3439f..fb30801 100644 --- a/src/libcgroup.map +++ b/src/libcgroup.map @@ -96,3 +96,10 @@ CGROUP_0.37 { cgroup_read_value_end; cg_chmod_recursive; } CGROUP_0.36; + +CGROUP_0.38 { + cgroup_get_subsys_mount_point_begin; + cgroup_get_subsys_mount_point_next; + cgroup_get_subsys_mount_point_end; +} CGROUP_0.37; + ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel