On 05/20/2011 02:13 PM, Ivana Hutarova Varekova wrote:
> Most of the tools use <controllers>:<path> together with -g option,
> this patch adds this version of usage of -g  option to cgget tool
> Older have the possibility to use  -g in form -g <controller> <path>.
> 
> --------------
> old version:
> $ cgget -h
> Usage: cgget [-nv] [-r<name>] [-g<controller>] [-a] ...<path> ...
> 
> new version:
> $ ./cgget -h
> Usage: cgget [-nv] [-r<name>] [-g<controller>] [-a] <path> ...
>    or: cgget [-nv] [-r<name>] -g<controller>:<path> ...
> 
> Signed-off-by: Ivana Hutarova Varekova <varek...@redhat.com>
> ---
> 
>  src/tools/cgget.c |  286 
> ++++++++++++++++++++++++++++++-----------------------
>  1 files changed, 163 insertions(+), 123 deletions(-)
> 
> diff --git a/src/tools/cgget.c b/src/tools/cgget.c
> index 87cdc8e..e89b5f8 100644
> --- a/src/tools/cgget.c
> +++ b/src/tools/cgget.c
> @@ -24,6 +24,12 @@ static struct option const long_options[] =
>       {NULL, 0, NULL, 0}
>  };
>  
> +enum group{
> +    GR_NOTSET = 0,   /* 0 .. path not specified -g<g>  or -a not used */
> +    GR_GROUP,                /* 1 .. path not specified -g<g>  or -a used */
> +    GR_LIST          /* 2 .. path specified using -g<g>:<p> */

Only GR_NOTSET is used below, magic numbers are used instead of the
other items!


> +};
> +
>  
>  static void usage(int status, const char *program_name)
>  {
> @@ -32,12 +38,15 @@ static void usage(int status, const char *program_name)
>                       " try %s -h' for more information.\n",
>                       program_name);
>       else {
> -             printf("Usage: %s [-nv] [-r<name>] [-g<controller>] [-a] ... "\
> -                     "<path> ...\n", program_name);
> +             fprintf(stdout, "Usage: %s [-nv] [-r<name>] "\
> +                     "[-g<controller>] [-a] <path> ...\n", program_name);
> +             fprintf(stdout, "   or: %s [-nv] [-r<name>] "\
> +                     "-g<controller>:<path> ...\n", program_name);
>       }
>  }
>  
> -static int display_one_record(char *name, struct cgroup_controller 
> *group_controller,
> +static int display_record(char *name,
> +     struct cgroup_controller *group_controller,
>       const char *group_name, const char *program_name, int mode)
>  {
>       int ret = 0;
> @@ -54,58 +63,52 @@ static int display_one_record(char *name, struct 
> cgroup_controller *group_contro
>  
>       if (ret == ECGEOF) {
>               printf("\n");
> -             ret = 0;
>               goto read_end;
>       }
>  
> -     if (ret != 0) {
> -             fprintf(stderr, "variable file read failed %d\n", ret);
> -             return ret;
> -     }
> +     if (ret != 0)
> +             goto end;
>  
>       printf("%s", line);
> -     if (line[strlen(line)-1] == '\n') {
> -             /* if the value continue on the net row,
> -              * indent the next row
> -              */
> +     if (line[strlen(line)-1] == '\n')
> +             /* if value continue on the next row. indent it */
>               ind = 1;
> -     }
> +
>  
>       /* read iteratively the whole value  */
>       while ((ret = cgroup_read_value_next(&handle, line, LL_MAX)) == 0) {
> -             if (ind == 1) {
> +             if (ind == 1)
>                       printf("\t");
> -                     ind = 0;
> -             }
> -
>               printf("%s", line);
> +             ind = 0;
>  
> -             if (line[strlen(line)-1] == '\n') {
> -                     /* if the value continue on the net row,
> -                      * indent the next row
> -                      */
> +             /* if value continue on the next row. indent it */
> +             if (line[strlen(line)-1] == '\n')
>                       ind = 1;
> -             }
>       }
>  
> +read_end:
> +     cgroup_read_value_end(&handle);
>       if (ret == ECGEOF)
>               ret = 0;
> -read_end:
>  
> -     cgroup_read_value_end(&handle);
> +end:
> +     if (ret != 0)
> +             fprintf(stderr, "variable file read failed %s\n",
> +                     cgroup_strerror(ret));
>       return ret;
>  }
>  
>  
>  
> -static int display_name_values(char **names, int count, const char* 
> group_name,
> +static int display_name_values(char **names, const char* group_name,
>               const char *program_name, int mode)
>  {
>       int i;
>       struct cgroup_controller *group_controller = NULL;
>       struct cgroup *group = NULL;
>       int ret = 0;
> -     char *controller = NULL, *parameter = NULL;
> +     char *controller = NULL, *dot;
>  
>       group = cgroup_new_cgroup(group_name);
>       if (group == NULL) {
> @@ -120,7 +123,8 @@ static int display_name_values(char **names, int count, 
> const char* group_name,
>               goto err;
>       }
>  
> -     for (i = 0; i < count; i++) {
> +     i = 0;
> +     while (names[i] != NULL) {
>               /* Parse the controller out of 'controller.parameter'. */
>               free(controller);
>               controller = strdup(names[i]);
> @@ -129,15 +133,14 @@ static int display_name_values(char **names, int count, 
> const char* group_name,
>                       ret = -1;
>                       goto err;
>               }
> -             parameter = strchr(controller, '.');
> -             if (parameter == NULL) {
> +             dot = strchr(controller, '.');
> +             if (dot == NULL) {
>                       fprintf(stderr, "%s: error parsing parameter name\n" \
>                                       " '%s'", program_name, names[i]);
>                       ret = -1;
>                       goto err;
>               }
> -             *parameter = '\0';
> -             parameter++;
> +             *dot = '\0';
>  
>               /* Find appropriate controller. */
>               group_controller = cgroup_get_controller(group, controller);
> @@ -150,10 +153,11 @@ static int display_name_values(char **names, int count, 
> const char* group_name,
>               }
>  
>               /* Finally read the parameter value.*/
> -             ret = display_one_record(names[i], group_controller,
> +             ret = display_record(names[i], group_controller,
>                       group_name, program_name, mode);
>               if (ret != 0)
>                       goto err;
> +             i++;
>       }
>  err:
>       if (controller)
> @@ -163,8 +167,8 @@ err:
>       return ret;
>  }
>  
> -static int display_controller_values(char **controllers, int count,
> -             const char *group_name, const char *program_name, int mode)
> +static int display_controller_values(char **controllers, const char 
> *group_name,
> +     const char *program_name, int mode)
>  {
>       struct cgroup *group = NULL;
>       struct cgroup_controller *group_controller = NULL;
> @@ -190,8 +194,8 @@ static int display_controller_values(char **controllers, 
> int count,
>       }
>  
>       /* for all wanted controllers */
> -     for (j = 0; j < count; j++) {
> -
> +     j = 0;
> +     while (controllers[j] != NULL) {
>               /* read the controller group data */
>               group_controller = cgroup_get_controller(group, controllers[j]);
>               if (group_controller == NULL) {
> @@ -208,7 +212,7 @@ static int display_controller_values(char **controllers, 
> int count,
>               for (i = 0; i < name_count; i++) {
>                       name = cgroup_get_value_name(group_controller, i);
>                       if (name != NULL) {
> -                             ret = display_one_record(name, group_controller,
> +                             ret = display_record(name, group_controller,
>                                       group_name, program_name, mode);
>                               if (ret) {
>                                       result = ret;
> @@ -216,6 +220,7 @@ static int display_controller_values(char **controllers, 
> int count,
>                               }
>                       }
>               }
> +             j = j+1;
>       }
>  
>  err:
> @@ -224,62 +229,67 @@ err:
>  
>  }
>  
> -static int display_all_controllers(const char *group_name,
> -     const char *program_name, int mode)
> +static int display_values(char **controllers, int max, const char 
> *group_name,
> +     char **names, int mode, const char *program_name)
>  {
> -     void *handle;
> -     int ret;
> -     struct cgroup_mount_point controller;
> -     char *name;
> -     int succ = 0;
> +     int ret, result = 0;
>  
> -     ret = cgroup_get_controller_begin(&handle, &controller);
> +     /* display the directory if needed */
> +     if (mode & MODE_SHOW_HEADERS)
> +             printf("%s:\n", group_name);
>  
> -     /* go through the list of controllers/mount point pairs */
> -     while (ret == 0) {
> -             name = controller.name;
> -             succ |= display_controller_values(&name, 1,
> -                     group_name, program_name, mode);
> -             ret = cgroup_get_controller_next(&handle, &controller);
> +     /* display all wanted variables */
> +     if (names[0] != NULL) {
> +             ret = display_name_values(names, group_name, program_name,
> +                     mode);
> +             if (ret)
> +                     result = ret;
> +     }
> +
> +     /* display all wanted controllers */
> +     if (controllers[0] != NULL) {
> +             ret = display_controller_values(controllers, group_name,
> +                     program_name, mode);
> +             if (ret)
> +                     result = ret;
>       }
>  
> -     cgroup_get_controller_end(&handle);
> -     return succ;
> +     /* separate each group with empty line. */
> +     if (mode & MODE_SHOW_HEADERS)
> +             printf("\n");
> +
> +     return result;
>  }
>  
> -static int add_record_to_buffer(int *p_number,
> -     int *p_max, char ***p_records, char *new_rec)
> +void add_record_to_buffer(char **buffer, char *record, int capacity)
>  {
> +     int i;
>  
> -     if (*p_number >= *p_max) {
> -             *p_max += CG_NV_MAX;
> -             *p_records = (char **) realloc(*p_records,
> -                     *p_max * sizeof(char *));
> -             if (!(*p_records)) {
> -                     fprintf(stderr, "not enough memory\n");
> -                     return -1;
> -             }
> +     /* find first free entry inside the cgroup data array */
> +     for (i = 0; i < capacity; i++) {
> +             if (!buffer[i])
> +                     break;
>       }
>  
> -     (*p_records)[*p_number] = new_rec;
> -     (*p_number)++;
> -
> -     return 0;
> +     if (i < capacity)
> +             buffer[i] = strdup(record);
>  }
>  
> +
>  int main(int argc, char *argv[])
>  {
>       int ret = 0;
>       int result = 0;
>       int c, i;
> +     int group_needed = GR_NOTSET;
>  
> -     char **names = NULL;
> -     int n_number = 0;
> -     int n_max = 0;
> +     int capacity = argc + CG_CONTROLLER_MAX; /* maximal number of records */
> +     struct cgroup_group_spec **cgroup_list; /* list of all groups */
> +     char **names;                   /* list of wanted variable names */
> +     char **controllers;             /* list of wanted controllers*/
>  
> -     char **controllers = NULL;
> -     int c_number = 0;
> -     int c_max = 0;
> +     void *handle;
> +     struct cgroup_mount_point controller;
>  
>       int mode = MODE_SHOW_NAMES | MODE_SHOW_HEADERS;
>  
> @@ -289,6 +299,17 @@ int main(int argc, char *argv[])
>               return 1;
>       }
>  
> +     names = (char **)calloc(capacity+1, sizeof(char *));
> +     controllers = (char **)calloc(capacity+1, sizeof(char *));
> +     cgroup_list = (struct cgroup_group_spec **)calloc(capacity,
> +             sizeof(struct cgroup_group_spec *));
> +     if ((names == NULL) || (controllers == NULL) ||
> +             (cgroup_list == NULL)) {
> +             fprintf(stderr, "%s: out of memory\n", argv[0]);
> +             ret = -1;
> +             goto err;
> +     }
> +
>       /* Parse arguments. */
>       while ((c = getopt_long(argc, argv, "r:hnvg:a", long_options, NULL))
>               > 0) {
> @@ -311,23 +332,49 @@ int main(int argc, char *argv[])
>  
>               case 'r':
>                       /* Add name to buffer. */
> -                     ret = add_record_to_buffer(
> -                             &n_number, &n_max, &names, optarg);
> +                     add_record_to_buffer(names, optarg, capacity);
>                       if (ret) {
>                               result = ret;
>                               goto err;
>                       }
>                       break;
>               case 'g':
> -                     /* for each controller add all variables to list */
> -                     ret = add_record_to_buffer(&c_number,
> -                             &c_max, &controllers, optarg);
> -                     if (ret) {
> -                             result = ret;
> -                             goto err;
> +                     if (strchr(optarg, ':') == NULL) {
> +                             /* -g <group> */
> +                             if (group_needed == 2) {
> +                                     usage(1, argv[0]);
> +                                     result = -1;
> +                                     goto err;
> +                             }
> +                             group_needed = 1;
> +                             add_record_to_buffer(controllers, optarg,
> +                                     capacity);
> +                     } else {
> +                             /* -g <group>:<path> */
> +                             if (group_needed == 1) {
> +                                     usage(1, argv[0]);
> +                                     result = -1;
> +                                     goto err;
> +                             }
> +                             group_needed = 2;
> +                             ret = parse_cgroup_spec(cgroup_list, optarg,
> +                                     capacity);
> +                             if (ret) {
> +                                     fprintf(stderr, "%s: cgroup controller/"
> +                                             "path parsing failed (%s)\n",
> +                                             argv[0], argv[optind]);
> +                                     ret = -1;
> +                                     goto err;
> +                             }
>                       }
>                       break;
>               case 'a':
> +                     if (group_needed == 2) {
> +                             usage(1, argv[0]);
> +                             result = -1;
> +                             goto err;
> +                     }
> +                     group_needed = 1;
>                       /* go through cgroups for all possible controllers */
>                       mode |=  MODE_SHOW_ALL_CONTROLLERS;
>                       break;
> @@ -335,23 +382,17 @@ int main(int argc, char *argv[])
>                       usage(1, argv[0]);
>                       result = -1;
>                       goto err;
> -                     break;
>               }
>       }
>  
> -     if (!argv[optind]) {
> -             fprintf(stderr, "%s: no cgroup specified\n", argv[0]);
> +     if (((group_needed == 2) && (argv[optind])) ||
> +         ((group_needed != 2) && (!argv[optind]))) {
> +             /* mixed -g <controller>:<path> and <path> or path not set */
> +             usage(1, argv[0]);
>               result = -1;
>               goto err;
>       }
>  
> -     /*
> -      * if no controller or variable is set
> -      * then show values of all possible variables
> -      */
> -     if ((c_number == 0) && (n_number == 0))
> -             mode |=  MODE_SHOW_ALL_CONTROLLERS;
> -
>       /* Initialize libcgroup. */
>       ret = cgroup_init();
>       if (ret) {
> @@ -361,44 +402,43 @@ int main(int argc, char *argv[])
>               goto err;
>       }
>  
> -     if (!argv[optind]) {
> -             fprintf(stderr, "%s: no cgroup specified\n", argv[0]);
> -             result = -1;
> -             goto err;
> +     if ((mode & MODE_SHOW_ALL_CONTROLLERS) ||
> +             ((controllers[0] == NULL) && (names[0] == NULL)
> +             && (cgroup_list[0] == NULL))) {
> +             /* show info about all controllers */
> +             ret = cgroup_get_controller_begin(&handle, &controller);
> +             /* go through list of controllers, add them to the list */
> +             while (ret == 0) {
> +                     add_record_to_buffer(controllers, controller.name,
> +                             capacity);
> +                     ret = cgroup_get_controller_next(&handle, &controller);
> +             }
> +             cgroup_get_controller_end(&handle);
> +     }
> +
> +     /* Parse control groups set by -g<c>:<p> pairs */
> +     for (i = 0; i < capacity; i++) {
> +             if (!cgroup_list[i])
> +                     break;
> +             ret |= display_values(cgroup_list[i]->controllers, capacity,
> +                     cgroup_list[i]->path, names, mode, argv[0]);
>       }
>  
>       /* Parse control groups and print them .*/
>       for (i = optind; i < argc; i++) {
> -
> -             /* display the directory if needed */
> -             if (mode & MODE_SHOW_HEADERS)
> -                     printf("%s:\n", argv[i]);
> -
> -             ret = display_name_values(names,
> -                     n_number, argv[i], argv[0], mode);
> -             if (ret)
> -                     result = ret;
> -
> -             ret = display_controller_values(controllers, c_number, argv[i],
> -                     argv[0], mode - (mode & MODE_SHOW_ALL_CONTROLLERS));
> -             if (ret) {
> -                     result = ret;
> -                     goto err;
> -             }
> -
> -             if (mode & MODE_SHOW_ALL_CONTROLLERS) {
> -                     ret = display_all_controllers(argv[i], argv[0], mode);
> -                     /* remember the error but continue showing the rest */
> -                     if (ret)
> -                             result = ret;
> -             }
> -
> -             /* Separate each group with empty line. */
> -             if (mode & MODE_SHOW_HEADERS && i != argc-1)
> -                     printf("\n");
> +             ret |= display_values(controllers, capacity,
> +                     argv[i], names, mode, argv[0]);
>       }
>  
>  err:
> -     free(names);
> +     for (i = 0; i < capacity; i++) {
> +             if (cgroup_list[i])
> +                     cgroup_free_group_spec(cgroup_list[i]);
> +             if (controllers[i])
> +                     free(controllers[i]);
> +             if (names[i])
> +                     free(names[i]);
> +     }
> +

free(names);
free(cgroup_list);
free(controllers);


>       return result;
>  }
> 
> 
> ------------------------------------------------------------------------------
> What Every C/C++ and Fortran developer Should Know!
> Read this article and learn how Intel has extended the reach of its 
> next-generation tools to help Windows* and Linux* C/C++ and Fortran 
> developers boost performance applications - including clusters. 
> http://p.sf.net/sfu/intel-dev2devmay
> _______________________________________________
> Libcg-devel mailing list
> Libcg-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/libcg-devel
> 


------------------------------------------------------------------------------
vRanger cuts backup time in half-while increasing security.
With the market-leading solution for virtual backup and recovery, 
you get blazing-fast, flexible, and affordable data protection.
Download your free trial now. 
http://p.sf.net/sfu/quest-d2dcopy1
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to