On 04/06/2011 10:37 AM, Jan Safranek wrote:
> 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>
Acked-by: Ivana Hutarova Varekova<varek...@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


------------------------------------------------------------------------------
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

Reply via email to