[sheepdog] [PATCH v2 1/2] move parse_option_size to lib/option.c

Liu Yuan namei.unix at gmail.com
Mon Aug 26 07:42:58 CEST 2013


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;
+
+	switch (*postfix) {
+	case 'T':
+	case 't':
+		sizef *= 1024;
+	case 'G':
+	case 'g':
+		sizef *= 1024;
+	case 'M':
+	case 'm':
+		sizef *= 1024;
+	case 'K':
+	case 'k':
+		sizef *= 1024;
+	case 'b':
+	case '\0':
+		*ret = (uint64_t) sizef;
+		break;
+	default:
+err:
+		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;
+}
+
 int option_parse(char *arg, const char *delim, struct option_parser *parsers)
 {
 	char *savep, *opt;
-- 
1.7.9.5




More information about the sheepdog mailing list