[sheepdog] [PATCH v2 1/2] move parse_option_size to lib/option.c
Liu Yuan
namei.unix at gmail.com
Mon Aug 26 07:54:53 CEST 2013
On Mon, Aug 26, 2013 at 02:51:05PM +0900, MORITA Kazutaka wrote:
> At Mon, 26 Aug 2013 13:42:58 +0800,
> Liu Yuan wrote:
> >
> > Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> > ---
> > 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.
Why we need set 4MB instead of 4M? Allow only one subfix isn't simpler?
Thanks
Yuan
More information about the sheepdog
mailing list