On 04/06/2011 10:37 AM, Jan Safranek wrote:
> Now libcgroup is aware of hierarchies and all its mount points, let's
> extend lssubsys to show them. The patch also renames few variables to be
> descriptive, 'name' is not name of controller, it's list of controllers.
>
> Now (and also with the patch, '-m' works the same):
> $ lssubsys -m
> cpuset,cpuacct /cgroup/cpu
> memory /cgroup/memory
>
> With the patch:
> $ lssubsys -M
> cpuset,cpuacct /cgroup/cpu
> cpuset,cpuacct /cgroup/cpu2
> memory /cgroup/memory
>
> Signed-off-by: Jan Safranek<[email protected]>
The patch works ok, there remains the problem with hierarchies mount to 
the same mount point. I will sent a patch for this issue.

Acked-by: Ivana Hutarova Varekova<[email protected]>

> ---
>
>   doc/man/lssubsys.1   |   13 ++++++--
>   src/tools/lssubsys.c |   79 
> ++++++++++++++++++++++++++++++++++++++------------
>   2 files changed, 70 insertions(+), 22 deletions(-)
>
> diff --git a/doc/man/lssubsys.1 b/doc/man/lssubsys.1
> index 2555cb9..81a5f99 100644
> --- a/doc/man/lssubsys.1
> +++ b/doc/man/lssubsys.1
> @@ -7,9 +7,11 @@
>   lssubsys \- list hierarchies containing given subsystem
>
>   .SH SYNOPSIS
> -\fBlssubsys\fR  [\fB-m|--mount-points\fR] [\fIcontroller\fR] [...]
> +\fBlssubsys\fR  [\fB-m|--mount-points\fR] [\fB-M|--all-mount-points\fR]
> +[\fIcontroller\fR] [...]
>   .br
> -\fBlssubsys\fR  [\fB-m|--mount-points\fR] [\fB-i|--hierarchies\fR] 
> [\fB-a|--all\fR]
> +\fBlssubsys\fR  [\fB-m|--mount-points\fR] [\fB-M|--all-mount-points\fR]
> +[\fB-i|--hierarchies\fR] [\fB-a|--all\fR]
>   .br
>   \fBlssubsys\fR  [\fB-h|--help\fR]
>
> @@ -27,7 +29,12 @@ list all mounted subsystems.
>
>   .TP
>   .B -m, --mount-points
> -Display mount points.
> +Display mount points. Only the first mount points of shown hierarchies are 
> displayed.
> +
> +.TP
> +.B -M, --all-mount-points
> +Display mount points. All mount points of shown hierarchies are displayed, 
> each on
> +separate line.
>
>   .TP
>   .B -a, --all
> diff --git a/src/tools/lssubsys.c b/src/tools/lssubsys.c
> index f1225be..ad85e65 100644
> --- a/src/tools/lssubsys.c
> +++ b/src/tools/lssubsys.c
> @@ -23,7 +23,8 @@ enum flag{
>       FL_MOUNT = 1,   /* show the mount points */
>       FL_LIST = 2,
>       FL_ALL = 4,             /* show all subsystems - not mounted too */
> -    FL_HIERARCHY = 8 /* show info about hierarchies */
> +    FL_HIERARCHY = 8,        /* show info about hierarchies */
> +    FL_MOUNT_ALL = 16        /* show all mount points of hierarchies */
>   };
>
>   typedef char cont_name_t[FILENAME_MAX];
> @@ -42,25 +43,54 @@ static void usage(int status, const char *program_name)
>               fprintf(stdout, "List information about given controller(s). "\
>                       "If no controller is set list information about "\
>                       "all mounted controllers.\n");
> -             fprintf(stdout, "  -h, --help           Display this help\n");
> -             fprintf(stdout, "  -m, --mount-points   Display mount 
> points\n");
> -             fprintf(stdout, "  -a, --all            "\
> +             fprintf(stdout, "  -h, --help                   "\
> +                     "Display this help\n");
> +             fprintf(stdout, "  -m, --mount-points           "\
> +                     "Display mount points\n");
> +             fprintf(stdout, "  -M, --all-mount-points       "\
> +                     "Display all mount points\n");
> +             fprintf(stdout, "  -a, --all                    "\
>                       "Display information about all controllers "\
>                       "(including not mounted ones) \n");
> -             fprintf(stdout, "  -i, --hierarchies    Display information "\
> -                     "about hierarchies\n");
> +             fprintf(stdout, "  -i, --hierarchies            "\
> +                     "Display information about hierarchies\n");
>       }
>   }
>
> +static int print_controller_mount(const char *controller, const char *clist,
> +             const char *first_path, int flags)
> +{
> +     int ret = 0;
> +     void *handle;
> +     char path[FILENAME_MAX];
> +
> +     if (flags&  FL_MOUNT_ALL) {
> +             ret = cgroup_get_subsys_mount_point_begin(controller,&handle,
> +                             path);
> +             /* intentionally ignore error from above call */
> +             while (ret == 0) {
> +                     printf("%s %s\n", clist, path);
> +                     ret = cgroup_get_subsys_mount_point_next(&handle, path);
> +             }
> +             if (ret == ECGEOF)
> +                     ret = 0;
> +             cgroup_get_subsys_mount_point_end(&handle);
> +     } else {
> +             printf("%s %s\n", clist, first_path);
> +     }
> +     return ret;
> +}
> +
>   /* print data about input cont_name controller */
>   static int print_controller(cont_name_t cont_name, int flags)
>   {
>       int ret = 0;
> -     char name[FILENAME_MAX];
> +     char controller_list[FILENAME_MAX];
>       char path[FILENAME_MAX];
>       void *handle;
>       struct cgroup_mount_point controller;
>       int output = 0;
> +     char first_controller[FILENAME_MAX];
>
>       ret = cgroup_get_controller_begin(&handle,&controller);
>       if (ret != 0) {
> @@ -70,15 +100,16 @@ static int print_controller(cont_name_t cont_name, int 
> flags)
>       }
>
>       path[0] = '\0';
> -     name[0] = '\0';
> +     controller_list[0] = '\0';
>
>       /* go through the list of controllers */
>       while (ret == 0) {
>               if (strcmp(path, controller.path) == 0) {
>                       /* if it is still the same mount point */
> -                     strncat(name, "," , FILENAME_MAX-strlen(name)-1);
> -                     strncat(name, controller.name,
> -                             FILENAME_MAX-strlen(name)-1);
> +                     strncat(controller_list, "," ,
> +                                     FILENAME_MAX-strlen(controller_list)-1);
> +                     strncat(controller_list, controller.name,
> +                             FILENAME_MAX-strlen(controller_list)-1);
>               } else {
>                       /*
>                        * we got new mount point
> @@ -86,21 +117,26 @@ static int print_controller(cont_name_t cont_name, int 
> flags)
>                        */
>                       if (output) {
>                               if ((flags&   FL_MOUNT) != 0)
> -                                     printf("%s %s\n", name, path);
> +                                     print_controller_mount(first_controller,
> +                                                     controller_list, path,
> +                                                     flags);
>                               else
> -                                     printf("%s\n", name);
> +                                     printf("%s\n", controller_list);
>                               if ((flags&  FL_LIST) != 0) {
> -                                     /* we succesfully finish printing */
> +                                     /* we successfully finish printing */
>                                       output = 0;
>                                       break;
>                               }
>                       }
>
>                       output = 0;
> -                     strncpy(name, controller.name, FILENAME_MAX);
> -                     name[FILENAME_MAX-1] = '\0';
> +                     strncpy(controller_list, controller.name, FILENAME_MAX);
> +                     controller_list[FILENAME_MAX-1] = '\0';
>                       strncpy(path, controller.path, FILENAME_MAX);
>                       path[FILENAME_MAX-1] = '\0';
> +                     strncpy(first_controller, controller.name,
> +                                     FILENAME_MAX);
> +                     first_controller[FILENAME_MAX-1] = '\0';
>               }
>
>               /* set output flag */
> @@ -114,9 +150,10 @@ static int print_controller(cont_name_t cont_name, int 
> flags)
>
>       if (output) {
>               if ((flags&   FL_MOUNT) != 0)
> -                     printf("%s %s\n", name, path);
> +                     print_controller_mount(first_controller,
> +                                     controller_list, path, flags);
>               else
> -                     printf("%s\n", name);
> +                     printf("%s\n", controller_list);
>               if ((flags&  FL_LIST) != 0)
>                       ret = 0;
>       }
> @@ -328,6 +365,7 @@ int main(int argc, char *argv[])
>       static struct option options[] = {
>               {"help", 0, 0, 'h'},
>               {"mount-points", 0, 0, 'm'},
> +             {"all-mount-points", 0, 0, 'M'},
>               {"all", 0, 0, 'a'},
>               {"hierarchies", 0, 0, 'i'},
>               {0, 0, 0, 0}
> @@ -337,7 +375,7 @@ int main(int argc, char *argv[])
>               cont_name[i][0] = '\0';
>
>       /* parse arguments */
> -     while ((c = getopt_long(argc, argv, "mhai", options, NULL))>  0) {
> +     while ((c = getopt_long(argc, argv, "mMhai", options, NULL))>  0) {
>               switch (c) {
>               case 'h':
>                       usage(0, argv[0]);
> @@ -345,6 +383,9 @@ int main(int argc, char *argv[])
>               case 'm':
>                       flags |= FL_MOUNT;
>                       break;
> +             case 'M':
> +                     flags |= FL_MOUNT | FL_MOUNT_ALL;
> +                     break;
>               case 'a':
>                       flags |= FL_ALL;
>                       break;
>
>
> ------------------------------------------------------------------------------
> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to