qemu-img: factor out parse_output_format() and use it in the code
Use common code and simplify error message Signed-off-by: Michael Tokarev <mjt@tls.msk.ru> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20250531171609.197078-7-mjt@tls.msk.ru> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
52292ba8b6
commit
a03cd2982d
5 changed files with 29 additions and 48 deletions
63
qemu-img.c
63
qemu-img.c
|
|
@ -158,6 +158,17 @@ void cmd_help(const img_cmd_t *ccmd,
|
|||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static OutputFormat parse_output_format(const char *argv0, const char *arg)
|
||||
{
|
||||
if (!strcmp(arg, "json")) {
|
||||
return OFORMAT_JSON;
|
||||
} else if (!strcmp(arg, "human")) {
|
||||
return OFORMAT_HUMAN;
|
||||
} else {
|
||||
error_exit(argv0, "--output expects 'human' or 'json', not '%s'", arg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Please keep in synch with docs/tools/qemu-img.rst */
|
||||
static G_NORETURN
|
||||
void help(void)
|
||||
|
|
@ -775,7 +786,7 @@ static int img_check(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
{
|
||||
int c, ret;
|
||||
OutputFormat output_format = OFORMAT_HUMAN;
|
||||
const char *filename, *fmt, *output, *cache;
|
||||
const char *filename, *fmt, *cache;
|
||||
BlockBackend *blk;
|
||||
BlockDriverState *bs;
|
||||
int fix = 0;
|
||||
|
|
@ -787,7 +798,6 @@ static int img_check(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
bool force_share = false;
|
||||
|
||||
fmt = NULL;
|
||||
output = NULL;
|
||||
cache = BDRV_DEFAULT_CACHE;
|
||||
|
||||
for(;;) {
|
||||
|
|
@ -833,7 +843,7 @@ static int img_check(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
}
|
||||
break;
|
||||
case OPTION_OUTPUT:
|
||||
output = optarg;
|
||||
output_format = parse_output_format(argv[0], optarg);
|
||||
break;
|
||||
case 'T':
|
||||
cache = optarg;
|
||||
|
|
@ -857,15 +867,6 @@ static int img_check(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
}
|
||||
filename = argv[optind++];
|
||||
|
||||
if (output && !strcmp(output, "json")) {
|
||||
output_format = OFORMAT_JSON;
|
||||
} else if (output && !strcmp(output, "human")) {
|
||||
output_format = OFORMAT_HUMAN;
|
||||
} else if (output) {
|
||||
error_report("--output must be used with human or json as argument.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
ret = bdrv_parse_cache_mode(cache, &flags, &writethrough);
|
||||
if (ret < 0) {
|
||||
error_report("Invalid source cache option: %s", cache);
|
||||
|
|
@ -3059,13 +3060,12 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
int c;
|
||||
OutputFormat output_format = OFORMAT_HUMAN;
|
||||
bool chain = false;
|
||||
const char *filename, *fmt, *output;
|
||||
const char *filename, *fmt;
|
||||
BlockGraphInfoList *list;
|
||||
bool image_opts = false;
|
||||
bool force_share = false;
|
||||
|
||||
fmt = NULL;
|
||||
output = NULL;
|
||||
for(;;) {
|
||||
int option_index = 0;
|
||||
static const struct option long_options[] = {
|
||||
|
|
@ -3100,7 +3100,7 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
force_share = true;
|
||||
break;
|
||||
case OPTION_OUTPUT:
|
||||
output = optarg;
|
||||
output_format = parse_output_format(argv[0], optarg);
|
||||
break;
|
||||
case OPTION_BACKING_CHAIN:
|
||||
chain = true;
|
||||
|
|
@ -3118,15 +3118,6 @@ static int img_info(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
}
|
||||
filename = argv[optind++];
|
||||
|
||||
if (output && !strcmp(output, "json")) {
|
||||
output_format = OFORMAT_JSON;
|
||||
} else if (output && !strcmp(output, "human")) {
|
||||
output_format = OFORMAT_HUMAN;
|
||||
} else if (output) {
|
||||
error_report("--output must be used with human or json as argument.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
list = collect_image_info_list(image_opts, filename, fmt, chain,
|
||||
force_share);
|
||||
if (!list) {
|
||||
|
|
@ -3285,7 +3276,7 @@ static int img_map(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
OutputFormat output_format = OFORMAT_HUMAN;
|
||||
BlockBackend *blk;
|
||||
BlockDriverState *bs;
|
||||
const char *filename, *fmt, *output;
|
||||
const char *filename, *fmt;
|
||||
int64_t length;
|
||||
MapEntry curr = { .length = 0 }, next;
|
||||
int ret = 0;
|
||||
|
|
@ -3295,7 +3286,6 @@ static int img_map(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
int64_t max_length = -1;
|
||||
|
||||
fmt = NULL;
|
||||
output = NULL;
|
||||
for (;;) {
|
||||
int option_index = 0;
|
||||
static const struct option long_options[] = {
|
||||
|
|
@ -3331,7 +3321,7 @@ static int img_map(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
force_share = true;
|
||||
break;
|
||||
case OPTION_OUTPUT:
|
||||
output = optarg;
|
||||
output_format = parse_output_format(argv[0], optarg);
|
||||
break;
|
||||
case 's':
|
||||
start_offset = cvtnum("start offset", optarg);
|
||||
|
|
@ -3358,15 +3348,6 @@ static int img_map(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
}
|
||||
filename = argv[optind];
|
||||
|
||||
if (output && !strcmp(output, "json")) {
|
||||
output_format = OFORMAT_JSON;
|
||||
} else if (output && !strcmp(output, "human")) {
|
||||
output_format = OFORMAT_HUMAN;
|
||||
} else if (output) {
|
||||
error_report("--output must be used with human or json as argument.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
blk = img_open(image_opts, filename, fmt, 0, false, false, force_share);
|
||||
if (!blk) {
|
||||
return 1;
|
||||
|
|
@ -5473,15 +5454,7 @@ static int img_measure(const img_cmd_t *ccmd, int argc, char **argv)
|
|||
image_opts = true;
|
||||
break;
|
||||
case OPTION_OUTPUT:
|
||||
if (!strcmp(optarg, "json")) {
|
||||
output_format = OFORMAT_JSON;
|
||||
} else if (!strcmp(optarg, "human")) {
|
||||
output_format = OFORMAT_HUMAN;
|
||||
} else {
|
||||
error_report("--output must be used with human or json "
|
||||
"as argument.");
|
||||
goto out;
|
||||
}
|
||||
output_format = parse_output_format(argv[0], optarg);
|
||||
break;
|
||||
case OPTION_SIZE:
|
||||
img_size = cvtnum("image size", optarg);
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ $QEMU_IMG measure -f qcow2 # missing filename
|
|||
$QEMU_IMG measure -l snap1 # missing filename
|
||||
$QEMU_IMG measure -o , # invalid option list
|
||||
$QEMU_IMG measure -l snapshot.foo=bar # invalid snapshot option
|
||||
$QEMU_IMG measure --output foo # invalid output format
|
||||
$QEMU_IMG measure --output foo 2>&1 | _filter_qemu_img # invalid output format
|
||||
$QEMU_IMG measure --size -1 # invalid image size
|
||||
$QEMU_IMG measure -O foo "$TEST_IMG" # unknown image file format
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ qemu-img: --image-opts, -f, and -l require a filename argument.
|
|||
qemu-img: Invalid option list: ,
|
||||
qemu-img: Invalid parameter 'snapshot.foo'
|
||||
qemu-img: Failed in parsing snapshot param 'snapshot.foo=bar'
|
||||
qemu-img: --output must be used with human or json as argument.
|
||||
qemu-img: --output expects 'human' or 'json', not 'foo'
|
||||
Try 'qemu-img measure --help' for more information
|
||||
qemu-img: Invalid image size specified. Must be between 0 and 9223372036854775807.
|
||||
qemu-img: Unknown file format 'foo'
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ qemu-img: --image-opts, -f, and -l require a filename argument.
|
|||
qemu-img: Invalid option list: ,
|
||||
qemu-img: Invalid parameter 'snapshot.foo'
|
||||
qemu-img: Failed in parsing snapshot param 'snapshot.foo=bar'
|
||||
qemu-img: --output must be used with human or json as argument.
|
||||
qemu-img: --output expects 'human' or 'json', not 'foo'
|
||||
Try 'qemu-img measure --help' for more information
|
||||
qemu-img: Invalid image size specified. Must be between 0 and 9223372036854775807.
|
||||
qemu-img: Unknown file format 'foo'
|
||||
|
||||
|
|
|
|||
|
|
@ -86,6 +86,12 @@ _filter_qemu()
|
|||
-e $'s#\r##' # QEMU monitor uses \r\n line endings
|
||||
}
|
||||
|
||||
# replace occurrences of QEMU_IMG_PROG with "qemu-img"
|
||||
_filter_qemu_img()
|
||||
{
|
||||
sed -e "s#$QEMU_IMG_PROG#qemu-img#g"
|
||||
}
|
||||
|
||||
# replace problematic QMP output like timestamps
|
||||
_filter_qmp()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue