At Mon, 26 Aug 2013 13:42:58 +0800,
Liu Yuan wrote:
> 
> Signed-off-by: Liu Yuan <[email protected]>
> ---
>  dog/vdi.c        |   42 ++++++------------------------------------
>  include/option.h |    1 +
>  lib/option.c     |   37 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 44 insertions(+), 36 deletions(-)
> 
> diff --git a/dog/vdi.c b/dog/vdi.c
> index 0ce3785..30f686b 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -55,36 +55,6 @@ struct get_vdi_info {
>       uint8_t nr_copies;
>  };
>  
> -static int parse_option_size(const char *value, uint64_t *ret)
> -{
> -     char *postfix;
> -     double sizef;
> -
> -     sizef = strtod(value, &postfix);
> -     switch (*postfix) {
> -     case 'T':
> -             sizef *= 1024;
> -     case 'G':
> -             sizef *= 1024;
> -     case 'M':
> -             sizef *= 1024;
> -     case 'K':
> -     case 'k':
> -             sizef *= 1024;
> -     case 'b':
> -     case '\0':
> -             *ret = (uint64_t) sizef;
> -             break;
> -     default:
> -             sd_err("Invalid size '%s'", value);
> -             sd_err("You may use k, M, G or T suffixes for "
> -                    "kilobytes, megabytes, gigabytes and terabytes.");
> -             return -1;
> -     }
> -
> -     return 0;
> -}
> -
>  static void vdi_show_progress(uint64_t done, uint64_t total)
>  {
>       return show_progress(done, total, false);
> @@ -502,7 +472,7 @@ static int vdi_create(int argc, char **argv)
>               sd_err("Please specify the VDI size");
>               return EXIT_USAGE;
>       }
> -     ret = parse_option_size(argv[optind], &size);
> +     ret = option_parse_size(argv[optind], &size);
>       if (ret < 0)
>               return EXIT_USAGE;
>       if (size > SD_MAX_VDI_SIZE) {
> @@ -699,7 +669,7 @@ static int vdi_resize(int argc, char **argv)
>               sd_err("Please specify the new size for the VDI");
>               return EXIT_USAGE;
>       }
> -     ret = parse_option_size(argv[optind], &new_size);
> +     ret = option_parse_size(argv[optind], &new_size);
>       if (ret < 0)
>               return EXIT_USAGE;
>       if (new_size > SD_MAX_VDI_SIZE) {
> @@ -1160,11 +1130,11 @@ static int vdi_read(int argc, char **argv)
>       char *buf = NULL;
>  
>       if (argv[optind]) {
> -             ret = parse_option_size(argv[optind++], &offset);
> +             ret = option_parse_size(argv[optind++], &offset);
>               if (ret < 0)
>                       return EXIT_USAGE;
>               if (argv[optind]) {
> -                     ret = parse_option_size(argv[optind++], &total);
> +                     ret = option_parse_size(argv[optind++], &total);
>                       if (ret < 0)
>                               return EXIT_USAGE;
>               }
> @@ -1234,11 +1204,11 @@ static int vdi_write(int argc, char **argv)
>       bool create;
>  
>       if (argv[optind]) {
> -             ret = parse_option_size(argv[optind++], &offset);
> +             ret = option_parse_size(argv[optind++], &offset);
>               if (ret < 0)
>                       return EXIT_USAGE;
>               if (argv[optind]) {
> -                     ret = parse_option_size(argv[optind++], &total);
> +                     ret = option_parse_size(argv[optind++], &total);
>                       if (ret < 0)
>                               return EXIT_USAGE;
>               }
> diff --git a/include/option.h b/include/option.h
> index 3a1eb20..ba62496 100644
> --- a/include/option.h
> +++ b/include/option.h
> @@ -31,6 +31,7 @@ char *build_short_options(const struct sd_option *opts);
>  struct option *build_long_options(const struct sd_option *opts);
>  const char *option_get_help(const struct sd_option *, int);
>  int option_parse(char *arg, const char *delim, struct option_parser 
> *parsers);
> +int option_parse_size(const char *value, uint64_t *ret);
>  
>  #define sd_for_each_option(opt, opts)                \
>       for (opt = (opts); opt->name; opt++)
> diff --git a/lib/option.c b/lib/option.c
> index 39a4c52..d12c205 100644
> --- a/lib/option.c
> +++ b/lib/option.c
> @@ -61,6 +61,43 @@ const char *option_get_help(const struct sd_option 
> *sd_opts, int ch)
>       return NULL;
>  }
>  
> +int option_parse_size(const char *value, uint64_t *ret)
> +{
> +     char *postfix;
> +     double sizef;
> +
> +     sizef = strtod(value, &postfix);
> +     if (postfix[0] != '\0' && postfix[1] != '\0')
> +             goto err;

This makes the following command an error.

  $ dog vdi create test 4MB
  Invalid size '4MB'
  You may use k, M, G or T suffixes for kilobytes, megabytes, gigabytes and 
terabytes.
  .
  .

Thanks

Kazutaka
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to