Browse Source

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>
pull/294/head
Michael Tokarev 10 months ago
committed by Kevin Wolf
parent
commit
a03cd2982d
  1. 63
      qemu-img.c
  2. 2
      tests/qemu-iotests/178
  3. 3
      tests/qemu-iotests/178.out.qcow2
  4. 3
      tests/qemu-iotests/178.out.raw
  5. 6
      tests/qemu-iotests/common.filter

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);

2
tests/qemu-iotests/178

@ -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

3
tests/qemu-iotests/178.out.qcow2

@ -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'

3
tests/qemu-iotests/178.out.raw

@ -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'

6
tests/qemu-iotests/common.filter

@ -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…
Cancel
Save