]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
qdev-properties-system.c: Allow vlan or netdev for -device, not both
[qemu.git] / qemu-img.c
CommitLineData
ea2384d3 1/*
fb43f4dd 2 * QEMU disk image utility
5fafdf24 3 *
68d0f70e 4 * Copyright (c) 2003-2008 Fabrice Bellard
5fafdf24 5 *
ea2384d3
FB
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
c054b3fd
BC
24#include "qapi-visit.h"
25#include "qapi/qmp-output-visitor.h"
7b1b5d19 26#include "qapi/qmp/qjson.h"
faf07963 27#include "qemu-common.h"
1de7afc9
PB
28#include "qemu/option.h"
29#include "qemu/error-report.h"
30#include "qemu/osdep.h"
9c17d615 31#include "sysemu/sysemu.h"
737e150e 32#include "block/block_int.h"
f364ec65 33#include "block/qapi.h"
c054b3fd 34#include <getopt.h>
9230eaf6 35#include <stdio.h>
f382d43a 36#include <stdarg.h>
ea2384d3 37
e8445331
FB
38#ifdef _WIN32
39#include <windows.h>
40#endif
41
c227f099 42typedef struct img_cmd_t {
153859be
SB
43 const char *name;
44 int (*handler)(int argc, char **argv);
c227f099 45} img_cmd_t;
153859be 46
8599ea4c
FS
47enum {
48 OPTION_OUTPUT = 256,
49 OPTION_BACKING_CHAIN = 257,
50};
51
52typedef enum OutputFormat {
53 OFORMAT_JSON,
54 OFORMAT_HUMAN,
55} OutputFormat;
56
137519ce 57/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
adfe078e 58#define BDRV_O_FLAGS BDRV_O_CACHE_WB
661a0f71 59#define BDRV_DEFAULT_CACHE "writeback"
137519ce 60
ea2384d3
FB
61static void format_print(void *opaque, const char *name)
62{
63 printf(" %s", name);
64}
65
d2c639d6 66/* Please keep in synch with qemu-img.texi */
3f379ab1 67static void help(void)
ea2384d3 68{
e00291c0
PB
69 const char *help_msg =
70 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
3f020d70 71 "usage: qemu-img command [command options]\n"
72 "QEMU disk image utility\n"
73 "\n"
74 "Command syntax:\n"
153859be
SB
75#define DEF(option, callback, arg_string) \
76 " " arg_string "\n"
77#include "qemu-img-cmds.h"
78#undef DEF
79#undef GEN_DOCS
3f020d70 80 "\n"
81 "Command parameters:\n"
82 " 'filename' is a disk image filename\n"
83 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
661a0f71 84 " 'cache' is the cache mode used to write the output disk image, the valid\n"
80ccf93b
LY
85 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
86 " 'directsync' and 'unsafe' (default for convert)\n"
3f020d70 87 " 'size' is the disk image size in bytes. Optional suffixes\n"
5e00984a
KW
88 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n"
89 " 'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P) are\n"
90 " supported. 'b' is ignored.\n"
3f020d70 91 " 'output_filename' is the destination disk image filename\n"
92 " 'output_fmt' is the destination format\n"
93 " 'options' is a comma separated list of format specific options in a\n"
94 " name=value format. Use -o ? for an overview of the options supported by the\n"
95 " used format\n"
96 " '-c' indicates that target image must be compressed (qcow format only)\n"
97 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
98 " match exactly. The image doesn't need a working backing file before\n"
99 " rebasing in this case (useful for renaming the backing file)\n"
100 " '-h' with or without a command shows this help and lists the supported formats\n"
6b837bc4 101 " '-p' show progress of command (only certain commands)\n"
f382d43a 102 " '-q' use Quiet mode - do not print any output (except errors)\n"
a22f123c
KW
103 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
104 " for qemu-img to create a sparse image during conversion\n"
c054b3fd 105 " '--output' takes the format in which the output must be done (human or json)\n"
b2e10493
AD
106 " '-n' skips the target volume creation (useful if the volume is created\n"
107 " prior to running qemu-img)\n"
3f020d70 108 "\n"
4534ff54
KW
109 "Parameters to check subcommand:\n"
110 " '-r' tries to repair any inconsistencies that are found during the check.\n"
111 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
112 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
0546b8c2 113 " hiding corruption that has already occurred.\n"
4534ff54 114 "\n"
3f020d70 115 "Parameters to snapshot subcommand:\n"
116 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
117 " '-a' applies a snapshot (revert disk to saved state)\n"
118 " '-c' creates a snapshot\n"
119 " '-d' deletes a snapshot\n"
d14ed18c
MR
120 " '-l' lists all snapshots in the given image\n"
121 "\n"
122 "Parameters to compare subcommand:\n"
123 " '-f' first image format\n"
124 " '-F' second image format\n"
125 " '-s' run in Strict mode - fail on different image size or sector allocation\n";
e00291c0
PB
126
127 printf("%s\nSupported formats:", help_msg);
ea2384d3
FB
128 bdrv_iterate_format(format_print, NULL);
129 printf("\n");
130 exit(1);
131}
132
7c30f657 133static int GCC_FMT_ATTR(2, 3) qprintf(bool quiet, const char *fmt, ...)
f382d43a
MR
134{
135 int ret = 0;
136 if (!quiet) {
137 va_list args;
138 va_start(args, fmt);
139 ret = vprintf(fmt, args);
140 va_end(args);
141 }
142 return ret;
143}
144
ea2384d3
FB
145#if defined(WIN32)
146/* XXX: put correct support for win32 */
147static int read_password(char *buf, int buf_size)
148{
149 int c, i;
150 printf("Password: ");
151 fflush(stdout);
152 i = 0;
153 for(;;) {
154 c = getchar();
155 if (c == '\n')
156 break;
157 if (i < (buf_size - 1))
158 buf[i++] = c;
159 }
160 buf[i] = '\0';
161 return 0;
162}
163
164#else
165
166#include <termios.h>
167
168static struct termios oldtty;
169
170static void term_exit(void)
171{
172 tcsetattr (0, TCSANOW, &oldtty);
173}
174
175static void term_init(void)
176{
177 struct termios tty;
178
179 tcgetattr (0, &tty);
180 oldtty = tty;
181
182 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
183 |INLCR|IGNCR|ICRNL|IXON);
184 tty.c_oflag |= OPOST;
185 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
186 tty.c_cflag &= ~(CSIZE|PARENB);
187 tty.c_cflag |= CS8;
188 tty.c_cc[VMIN] = 1;
189 tty.c_cc[VTIME] = 0;
3b46e624 190
ea2384d3
FB
191 tcsetattr (0, TCSANOW, &tty);
192
193 atexit(term_exit);
194}
195
3f379ab1 196static int read_password(char *buf, int buf_size)
ea2384d3
FB
197{
198 uint8_t ch;
199 int i, ret;
200
201 printf("password: ");
202 fflush(stdout);
203 term_init();
204 i = 0;
205 for(;;) {
206 ret = read(0, &ch, 1);
207 if (ret == -1) {
208 if (errno == EAGAIN || errno == EINTR) {
209 continue;
210 } else {
211 ret = -1;
212 break;
213 }
214 } else if (ret == 0) {
215 ret = -1;
216 break;
217 } else {
218 if (ch == '\r') {
219 ret = 0;
220 break;
221 }
222 if (i < (buf_size - 1))
223 buf[i++] = ch;
224 }
225 }
226 term_exit();
227 buf[i] = '\0';
228 printf("\n");
229 return ret;
230}
231#endif
232
4ac8aacd
JS
233static int print_block_option_help(const char *filename, const char *fmt)
234{
235 BlockDriver *drv, *proto_drv;
236 QEMUOptionParameter *create_options = NULL;
237
238 /* Find driver and parse its options */
239 drv = bdrv_find_format(fmt);
240 if (!drv) {
15654a6d 241 error_report("Unknown file format '%s'", fmt);
4ac8aacd
JS
242 return 1;
243 }
244
98289620 245 proto_drv = bdrv_find_protocol(filename, true);
4ac8aacd 246 if (!proto_drv) {
15654a6d 247 error_report("Unknown protocol '%s'", filename);
4ac8aacd
JS
248 return 1;
249 }
250
251 create_options = append_option_parameters(create_options,
252 drv->create_options);
253 create_options = append_option_parameters(create_options,
254 proto_drv->create_options);
255 print_option_help(create_options);
256 free_option_parameters(create_options);
257 return 0;
258}
259
75c23805 260static BlockDriverState *bdrv_new_open(const char *filename,
9bc378c1 261 const char *fmt,
f0536bb8 262 int flags,
f382d43a
MR
263 bool require_io,
264 bool quiet)
75c23805
FB
265{
266 BlockDriverState *bs;
267 BlockDriver *drv;
268 char password[256];
34b5d2c6 269 Error *local_err = NULL;
b9eaf9ec 270 int ret;
75c23805 271
b9eaf9ec 272 bs = bdrv_new("image");
ad717139 273
75c23805
FB
274 if (fmt) {
275 drv = bdrv_find_format(fmt);
c2abccec 276 if (!drv) {
15654a6d 277 error_report("Unknown file format '%s'", fmt);
c2abccec
MK
278 goto fail;
279 }
75c23805
FB
280 } else {
281 drv = NULL;
282 }
b9eaf9ec 283
34b5d2c6 284 ret = bdrv_open(bs, filename, NULL, flags, drv, &local_err);
b9eaf9ec 285 if (ret < 0) {
34b5d2c6
MR
286 error_report("Could not open '%s': %s", filename,
287 error_get_pretty(local_err));
288 error_free(local_err);
c2abccec 289 goto fail;
75c23805 290 }
b9eaf9ec 291
f0536bb8 292 if (bdrv_is_encrypted(bs) && require_io) {
f382d43a 293 qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
c2abccec 294 if (read_password(password, sizeof(password)) < 0) {
15654a6d 295 error_report("No password given");
c2abccec
MK
296 goto fail;
297 }
298 if (bdrv_set_key(bs, password) < 0) {
15654a6d 299 error_report("invalid password");
c2abccec
MK
300 goto fail;
301 }
75c23805
FB
302 }
303 return bs;
c2abccec
MK
304fail:
305 if (bs) {
4f6fd349 306 bdrv_unref(bs);
c2abccec
MK
307 }
308 return NULL;
75c23805
FB
309}
310
c2abccec 311static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
312 const char *base_filename,
313 const char *base_fmt)
efa84d43 314{
efa84d43
KW
315 if (base_filename) {
316 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
15654a6d
JS
317 error_report("Backing file not supported for file format '%s'",
318 fmt);
c2abccec 319 return -1;
efa84d43
KW
320 }
321 }
322 if (base_fmt) {
323 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
15654a6d
JS
324 error_report("Backing file format not supported for file "
325 "format '%s'", fmt);
c2abccec 326 return -1;
efa84d43
KW
327 }
328 }
c2abccec 329 return 0;
efa84d43
KW
330}
331
ea2384d3
FB
332static int img_create(int argc, char **argv)
333{
a9300911 334 int c;
1da7cfbd 335 uint64_t img_size = -1;
ea2384d3 336 const char *fmt = "raw";
9230eaf6 337 const char *base_fmt = NULL;
ea2384d3
FB
338 const char *filename;
339 const char *base_filename = NULL;
9ea2ea71 340 char *options = NULL;
9b37525a 341 Error *local_err = NULL;
f382d43a 342 bool quiet = false;
3b46e624 343
ea2384d3 344 for(;;) {
f382d43a 345 c = getopt(argc, argv, "F:b:f:he6o:q");
b8fb60da 346 if (c == -1) {
ea2384d3 347 break;
b8fb60da 348 }
ea2384d3 349 switch(c) {
ef87394c 350 case '?':
ea2384d3
FB
351 case 'h':
352 help();
353 break;
9230eaf6
AL
354 case 'F':
355 base_fmt = optarg;
356 break;
ea2384d3
FB
357 case 'b':
358 base_filename = optarg;
359 break;
360 case 'f':
361 fmt = optarg;
362 break;
363 case 'e':
9d42e15d 364 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
365 "encryption\' instead!");
366 return 1;
d8871c5a 367 case '6':
9d42e15d 368 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
369 "compat6\' instead!");
370 return 1;
9ea2ea71
KW
371 case 'o':
372 options = optarg;
373 break;
f382d43a
MR
374 case 'q':
375 quiet = true;
376 break;
ea2384d3
FB
377 }
378 }
9230eaf6 379
b50cbabc 380 /* Get the filename */
b8fb60da 381 if (optind >= argc) {
b50cbabc 382 help();
b8fb60da 383 }
b50cbabc
MK
384 filename = argv[optind++];
385
1da7cfbd
JS
386 /* Get image size, if specified */
387 if (optind < argc) {
70b4f4bb 388 int64_t sval;
e36b3695
MA
389 char *end;
390 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
391 if (sval < 0 || *end) {
79443397 392 if (sval == -ERANGE) {
393 error_report("Image size must be less than 8 EiB!");
394 } else {
395 error_report("Invalid image size specified! You may use k, M, "
5e00984a
KW
396 "G, T, P or E suffixes for ");
397 error_report("kilobytes, megabytes, gigabytes, terabytes, "
398 "petabytes and exabytes.");
79443397 399 }
a9300911 400 return 1;
1da7cfbd
JS
401 }
402 img_size = (uint64_t)sval;
403 }
fc11eb26
KW
404 if (optind != argc) {
405 help();
406 }
1da7cfbd 407
c8057f95 408 if (options && is_help_option(options)) {
a9300911 409 return print_block_option_help(filename, fmt);
4ac8aacd
JS
410 }
411
9b37525a 412 bdrv_img_create(filename, fmt, base_filename, base_fmt,
f382d43a 413 options, img_size, BDRV_O_FLAGS, &local_err, quiet);
9b37525a 414 if (error_is_set(&local_err)) {
b70d8c23 415 error_report("%s: %s", filename, error_get_pretty(local_err));
9b37525a 416 error_free(local_err);
c2abccec
MK
417 return 1;
418 }
a9300911 419
ea2384d3
FB
420 return 0;
421}
422
f382d43a 423static void dump_json_image_check(ImageCheck *check, bool quiet)
8599ea4c
FS
424{
425 Error *errp = NULL;
426 QString *str;
427 QmpOutputVisitor *ov = qmp_output_visitor_new();
428 QObject *obj;
429 visit_type_ImageCheck(qmp_output_get_visitor(ov),
430 &check, NULL, &errp);
431 obj = qmp_output_get_qobject(ov);
432 str = qobject_to_json_pretty(obj);
433 assert(str != NULL);
f382d43a 434 qprintf(quiet, "%s\n", qstring_get_str(str));
8599ea4c
FS
435 qobject_decref(obj);
436 qmp_output_visitor_cleanup(ov);
437 QDECREF(str);
438}
439
f382d43a 440static void dump_human_image_check(ImageCheck *check, bool quiet)
8599ea4c
FS
441{
442 if (!(check->corruptions || check->leaks || check->check_errors)) {
f382d43a 443 qprintf(quiet, "No errors were found on the image.\n");
8599ea4c
FS
444 } else {
445 if (check->corruptions) {
f382d43a
MR
446 qprintf(quiet, "\n%" PRId64 " errors were found on the image.\n"
447 "Data may be corrupted, or further writes to the image "
448 "may corrupt it.\n",
449 check->corruptions);
8599ea4c
FS
450 }
451
452 if (check->leaks) {
f382d43a
MR
453 qprintf(quiet,
454 "\n%" PRId64 " leaked clusters were found on the image.\n"
455 "This means waste of disk space, but no harm to data.\n",
456 check->leaks);
8599ea4c
FS
457 }
458
459 if (check->check_errors) {
f382d43a
MR
460 qprintf(quiet,
461 "\n%" PRId64
462 " internal errors have occurred during the check.\n",
463 check->check_errors);
8599ea4c
FS
464 }
465 }
466
467 if (check->total_clusters != 0 && check->allocated_clusters != 0) {
f382d43a
MR
468 qprintf(quiet, "%" PRId64 "/%" PRId64 " = %0.2f%% allocated, "
469 "%0.2f%% fragmented, %0.2f%% compressed clusters\n",
470 check->allocated_clusters, check->total_clusters,
471 check->allocated_clusters * 100.0 / check->total_clusters,
472 check->fragmented_clusters * 100.0 / check->allocated_clusters,
473 check->compressed_clusters * 100.0 /
474 check->allocated_clusters);
8599ea4c
FS
475 }
476
477 if (check->image_end_offset) {
f382d43a
MR
478 qprintf(quiet,
479 "Image end offset: %" PRId64 "\n", check->image_end_offset);
8599ea4c
FS
480 }
481}
482
483static int collect_image_check(BlockDriverState *bs,
484 ImageCheck *check,
485 const char *filename,
486 const char *fmt,
487 int fix)
488{
489 int ret;
490 BdrvCheckResult result;
491
492 ret = bdrv_check(bs, &result, fix);
493 if (ret < 0) {
494 return ret;
495 }
496
497 check->filename = g_strdup(filename);
498 check->format = g_strdup(bdrv_get_format_name(bs));
499 check->check_errors = result.check_errors;
500 check->corruptions = result.corruptions;
501 check->has_corruptions = result.corruptions != 0;
502 check->leaks = result.leaks;
503 check->has_leaks = result.leaks != 0;
504 check->corruptions_fixed = result.corruptions_fixed;
505 check->has_corruptions_fixed = result.corruptions != 0;
506 check->leaks_fixed = result.leaks_fixed;
507 check->has_leaks_fixed = result.leaks != 0;
508 check->image_end_offset = result.image_end_offset;
509 check->has_image_end_offset = result.image_end_offset != 0;
510 check->total_clusters = result.bfi.total_clusters;
511 check->has_total_clusters = result.bfi.total_clusters != 0;
512 check->allocated_clusters = result.bfi.allocated_clusters;
513 check->has_allocated_clusters = result.bfi.allocated_clusters != 0;
514 check->fragmented_clusters = result.bfi.fragmented_clusters;
515 check->has_fragmented_clusters = result.bfi.fragmented_clusters != 0;
e6439d78
SH
516 check->compressed_clusters = result.bfi.compressed_clusters;
517 check->has_compressed_clusters = result.bfi.compressed_clusters != 0;
8599ea4c
FS
518
519 return 0;
520}
521
e076f338
KW
522/*
523 * Checks an image for consistency. Exit codes:
524 *
525 * 0 - Check completed, image is good
526 * 1 - Check not completed because of internal errors
527 * 2 - Check completed, image is corrupted
528 * 3 - Check completed, image has leaked clusters, but is good otherwise
529 */
1585969c
AL
530static int img_check(int argc, char **argv)
531{
532 int c, ret;
8599ea4c
FS
533 OutputFormat output_format = OFORMAT_HUMAN;
534 const char *filename, *fmt, *output;
1585969c 535 BlockDriverState *bs;
4534ff54 536 int fix = 0;
058f8f16 537 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
8599ea4c 538 ImageCheck *check;
f382d43a 539 bool quiet = false;
1585969c
AL
540
541 fmt = NULL;
8599ea4c 542 output = NULL;
1585969c 543 for(;;) {
8599ea4c
FS
544 int option_index = 0;
545 static const struct option long_options[] = {
546 {"help", no_argument, 0, 'h'},
547 {"format", required_argument, 0, 'f'},
548 {"repair", no_argument, 0, 'r'},
549 {"output", required_argument, 0, OPTION_OUTPUT},
550 {0, 0, 0, 0}
551 };
f382d43a 552 c = getopt_long(argc, argv, "f:hr:q",
8599ea4c 553 long_options, &option_index);
b8fb60da 554 if (c == -1) {
1585969c 555 break;
b8fb60da 556 }
1585969c 557 switch(c) {
ef87394c 558 case '?':
1585969c
AL
559 case 'h':
560 help();
561 break;
562 case 'f':
563 fmt = optarg;
564 break;
4534ff54
KW
565 case 'r':
566 flags |= BDRV_O_RDWR;
567
568 if (!strcmp(optarg, "leaks")) {
569 fix = BDRV_FIX_LEAKS;
570 } else if (!strcmp(optarg, "all")) {
571 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
572 } else {
573 help();
574 }
575 break;
8599ea4c
FS
576 case OPTION_OUTPUT:
577 output = optarg;
578 break;
f382d43a
MR
579 case 'q':
580 quiet = true;
581 break;
1585969c
AL
582 }
583 }
fc11eb26 584 if (optind != argc - 1) {
1585969c 585 help();
b8fb60da 586 }
1585969c
AL
587 filename = argv[optind++];
588
8599ea4c
FS
589 if (output && !strcmp(output, "json")) {
590 output_format = OFORMAT_JSON;
591 } else if (output && !strcmp(output, "human")) {
592 output_format = OFORMAT_HUMAN;
593 } else if (output) {
594 error_report("--output must be used with human or json as argument.");
595 return 1;
596 }
597
f382d43a 598 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
599 if (!bs) {
600 return 1;
601 }
8599ea4c
FS
602
603 check = g_new0(ImageCheck, 1);
604 ret = collect_image_check(bs, check, filename, fmt, fix);
e076f338
KW
605
606 if (ret == -ENOTSUP) {
8599ea4c
FS
607 if (output_format == OFORMAT_HUMAN) {
608 error_report("This image format does not support checks");
609 }
fefddf95 610 ret = 63;
8599ea4c 611 goto fail;
e076f338
KW
612 }
613
8599ea4c
FS
614 if (check->corruptions_fixed || check->leaks_fixed) {
615 int corruptions_fixed, leaks_fixed;
ccf34716 616
8599ea4c
FS
617 leaks_fixed = check->leaks_fixed;
618 corruptions_fixed = check->corruptions_fixed;
e076f338 619
8599ea4c 620 if (output_format == OFORMAT_HUMAN) {
f382d43a
MR
621 qprintf(quiet,
622 "The following inconsistencies were found and repaired:\n\n"
623 " %" PRId64 " leaked clusters\n"
624 " %" PRId64 " corruptions\n\n"
625 "Double checking the fixed image now...\n",
626 check->leaks_fixed,
627 check->corruptions_fixed);
e076f338
KW
628 }
629
8599ea4c 630 ret = collect_image_check(bs, check, filename, fmt, 0);
1585969c 631
8599ea4c
FS
632 check->leaks_fixed = leaks_fixed;
633 check->corruptions_fixed = corruptions_fixed;
f8111c24
DXW
634 }
635
8599ea4c
FS
636 switch (output_format) {
637 case OFORMAT_HUMAN:
f382d43a 638 dump_human_image_check(check, quiet);
8599ea4c
FS
639 break;
640 case OFORMAT_JSON:
f382d43a 641 dump_json_image_check(check, quiet);
8599ea4c 642 break;
c6bb9ad1
FS
643 }
644
8599ea4c
FS
645 if (ret || check->check_errors) {
646 ret = 1;
647 goto fail;
c2abccec 648 }
e076f338 649
8599ea4c
FS
650 if (check->corruptions) {
651 ret = 2;
652 } else if (check->leaks) {
653 ret = 3;
e076f338 654 } else {
8599ea4c 655 ret = 0;
e076f338 656 }
8599ea4c
FS
657
658fail:
659 qapi_free_ImageCheck(check);
4f6fd349 660 bdrv_unref(bs);
8599ea4c
FS
661
662 return ret;
1585969c
AL
663}
664
ea2384d3
FB
665static int img_commit(int argc, char **argv)
666{
661a0f71
FS
667 int c, ret, flags;
668 const char *filename, *fmt, *cache;
ea2384d3 669 BlockDriverState *bs;
f382d43a 670 bool quiet = false;
ea2384d3
FB
671
672 fmt = NULL;
661a0f71 673 cache = BDRV_DEFAULT_CACHE;
ea2384d3 674 for(;;) {
f382d43a 675 c = getopt(argc, argv, "f:ht:q");
b8fb60da 676 if (c == -1) {
ea2384d3 677 break;
b8fb60da 678 }
ea2384d3 679 switch(c) {
ef87394c 680 case '?':
ea2384d3
FB
681 case 'h':
682 help();
683 break;
684 case 'f':
685 fmt = optarg;
686 break;
661a0f71
FS
687 case 't':
688 cache = optarg;
689 break;
f382d43a
MR
690 case 'q':
691 quiet = true;
692 break;
ea2384d3
FB
693 }
694 }
fc11eb26 695 if (optind != argc - 1) {
ea2384d3 696 help();
b8fb60da 697 }
ea2384d3
FB
698 filename = argv[optind++];
699
661a0f71 700 flags = BDRV_O_RDWR;
c3993cdc 701 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
702 if (ret < 0) {
703 error_report("Invalid cache option: %s", cache);
704 return -1;
705 }
706
f382d43a 707 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
708 if (!bs) {
709 return 1;
710 }
ea2384d3
FB
711 ret = bdrv_commit(bs);
712 switch(ret) {
713 case 0:
f382d43a 714 qprintf(quiet, "Image committed.\n");
ea2384d3
FB
715 break;
716 case -ENOENT:
15654a6d 717 error_report("No disk inserted");
ea2384d3
FB
718 break;
719 case -EACCES:
15654a6d 720 error_report("Image is read-only");
ea2384d3
FB
721 break;
722 case -ENOTSUP:
15654a6d 723 error_report("Image is already committed");
ea2384d3
FB
724 break;
725 default:
15654a6d 726 error_report("Error while committing image");
ea2384d3
FB
727 break;
728 }
729
4f6fd349 730 bdrv_unref(bs);
c2abccec
MK
731 if (ret) {
732 return 1;
733 }
ea2384d3
FB
734 return 0;
735}
736
f58c7b35
TS
737/*
738 * Returns true iff the first sector pointed to by 'buf' contains at least
739 * a non-NUL byte.
740 *
741 * 'pnum' is set to the number of sectors (including and immediately following
742 * the first one) that are known to be in the same allocated/unallocated state.
743 */
ea2384d3
FB
744static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
745{
1a6d39fd
SH
746 bool is_zero;
747 int i;
ea2384d3
FB
748
749 if (n <= 0) {
750 *pnum = 0;
751 return 0;
752 }
1a6d39fd 753 is_zero = buffer_is_zero(buf, 512);
ea2384d3
FB
754 for(i = 1; i < n; i++) {
755 buf += 512;
1a6d39fd 756 if (is_zero != buffer_is_zero(buf, 512)) {
ea2384d3 757 break;
1a6d39fd 758 }
ea2384d3
FB
759 }
760 *pnum = i;
1a6d39fd 761 return !is_zero;
ea2384d3
FB
762}
763
a22f123c
KW
764/*
765 * Like is_allocated_sectors, but if the buffer starts with a used sector,
766 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
767 * breaking up write requests for only small sparse areas.
768 */
769static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
770 int min)
771{
772 int ret;
773 int num_checked, num_used;
774
775 if (n < min) {
776 min = n;
777 }
778
779 ret = is_allocated_sectors(buf, n, pnum);
780 if (!ret) {
781 return ret;
782 }
783
784 num_used = *pnum;
785 buf += BDRV_SECTOR_SIZE * *pnum;
786 n -= *pnum;
787 num_checked = num_used;
788
789 while (n > 0) {
790 ret = is_allocated_sectors(buf, n, pnum);
791
792 buf += BDRV_SECTOR_SIZE * *pnum;
793 n -= *pnum;
794 num_checked += *pnum;
795 if (ret) {
796 num_used = num_checked;
797 } else if (*pnum >= min) {
798 break;
799 }
800 }
801
802 *pnum = num_used;
803 return 1;
804}
805
3e85c6fd
KW
806/*
807 * Compares two buffers sector by sector. Returns 0 if the first sector of both
808 * buffers matches, non-zero otherwise.
809 *
810 * pnum is set to the number of sectors (including and immediately following
811 * the first one) that are known to have the same comparison result
812 */
813static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
814 int *pnum)
815{
816 int res, i;
817
818 if (n <= 0) {
819 *pnum = 0;
820 return 0;
821 }
822
823 res = !!memcmp(buf1, buf2, 512);
824 for(i = 1; i < n; i++) {
825 buf1 += 512;
826 buf2 += 512;
827
828 if (!!memcmp(buf1, buf2, 512) != res) {
829 break;
830 }
831 }
832
833 *pnum = i;
834 return res;
835}
836
80ee15a6 837#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3 838
d14ed18c
MR
839static int64_t sectors_to_bytes(int64_t sectors)
840{
841 return sectors << BDRV_SECTOR_BITS;
842}
843
844static int64_t sectors_to_process(int64_t total, int64_t from)
845{
846 return MIN(total - from, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
847}
848
849/*
850 * Check if passed sectors are empty (not allocated or contain only 0 bytes)
851 *
852 * Returns 0 in case sectors are filled with 0, 1 if sectors contain non-zero
853 * data and negative value on error.
854 *
855 * @param bs: Driver used for accessing file
856 * @param sect_num: Number of first sector to check
857 * @param sect_count: Number of sectors to check
858 * @param filename: Name of disk file we are checking (logging purpose)
859 * @param buffer: Allocated buffer for storing read data
860 * @param quiet: Flag for quiet mode
861 */
862static int check_empty_sectors(BlockDriverState *bs, int64_t sect_num,
863 int sect_count, const char *filename,
864 uint8_t *buffer, bool quiet)
865{
866 int pnum, ret = 0;
867 ret = bdrv_read(bs, sect_num, buffer, sect_count);
868 if (ret < 0) {
869 error_report("Error while reading offset %" PRId64 " of %s: %s",
870 sectors_to_bytes(sect_num), filename, strerror(-ret));
871 return ret;
872 }
873 ret = is_allocated_sectors(buffer, sect_count, &pnum);
874 if (ret || pnum != sect_count) {
875 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
876 sectors_to_bytes(ret ? sect_num : sect_num + pnum));
877 return 1;
878 }
879
880 return 0;
881}
882
883/*
884 * Compares two images. Exit codes:
885 *
886 * 0 - Images are identical
887 * 1 - Images differ
888 * >1 - Error occurred
889 */
890static int img_compare(int argc, char **argv)
891{
892 const char *fmt1 = NULL, *fmt2 = NULL, *filename1, *filename2;
893 BlockDriverState *bs1, *bs2;
894 int64_t total_sectors1, total_sectors2;
895 uint8_t *buf1 = NULL, *buf2 = NULL;
896 int pnum1, pnum2;
897 int allocated1, allocated2;
898 int ret = 0; /* return value - 0 Ident, 1 Different, >1 Error */
899 bool progress = false, quiet = false, strict = false;
900 int64_t total_sectors;
901 int64_t sector_num = 0;
902 int64_t nb_sectors;
903 int c, pnum;
904 uint64_t bs_sectors;
905 uint64_t progress_base;
906
907 for (;;) {
908 c = getopt(argc, argv, "hpf:F:sq");
909 if (c == -1) {
910 break;
911 }
912 switch (c) {
913 case '?':
914 case 'h':
915 help();
916 break;
917 case 'f':
918 fmt1 = optarg;
919 break;
920 case 'F':
921 fmt2 = optarg;
922 break;
923 case 'p':
924 progress = true;
925 break;
926 case 'q':
927 quiet = true;
928 break;
929 case 's':
930 strict = true;
931 break;
932 }
933 }
934
935 /* Progress is not shown in Quiet mode */
936 if (quiet) {
937 progress = false;
938 }
939
940
fc11eb26 941 if (optind != argc - 2) {
d14ed18c
MR
942 help();
943 }
944 filename1 = argv[optind++];
945 filename2 = argv[optind++];
946
947 /* Initialize before goto out */
948 qemu_progress_init(progress, 2.0);
949
950 bs1 = bdrv_new_open(filename1, fmt1, BDRV_O_FLAGS, true, quiet);
951 if (!bs1) {
952 error_report("Can't open file %s", filename1);
953 ret = 2;
954 goto out3;
955 }
956
957 bs2 = bdrv_new_open(filename2, fmt2, BDRV_O_FLAGS, true, quiet);
958 if (!bs2) {
959 error_report("Can't open file %s", filename2);
960 ret = 2;
961 goto out2;
962 }
963
964 buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
965 buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
966 bdrv_get_geometry(bs1, &bs_sectors);
967 total_sectors1 = bs_sectors;
968 bdrv_get_geometry(bs2, &bs_sectors);
969 total_sectors2 = bs_sectors;
970 total_sectors = MIN(total_sectors1, total_sectors2);
971 progress_base = MAX(total_sectors1, total_sectors2);
972
973 qemu_progress_print(0, 100);
974
975 if (strict && total_sectors1 != total_sectors2) {
976 ret = 1;
977 qprintf(quiet, "Strict mode: Image size mismatch!\n");
978 goto out;
979 }
980
981 for (;;) {
982 nb_sectors = sectors_to_process(total_sectors, sector_num);
983 if (nb_sectors <= 0) {
984 break;
985 }
986 allocated1 = bdrv_is_allocated_above(bs1, NULL, sector_num, nb_sectors,
987 &pnum1);
988 if (allocated1 < 0) {
989 ret = 3;
990 error_report("Sector allocation test failed for %s", filename1);
991 goto out;
992 }
993
994 allocated2 = bdrv_is_allocated_above(bs2, NULL, sector_num, nb_sectors,
995 &pnum2);
996 if (allocated2 < 0) {
997 ret = 3;
998 error_report("Sector allocation test failed for %s", filename2);
999 goto out;
1000 }
1001 nb_sectors = MIN(pnum1, pnum2);
1002
1003 if (allocated1 == allocated2) {
1004 if (allocated1) {
1005 ret = bdrv_read(bs1, sector_num, buf1, nb_sectors);
1006 if (ret < 0) {
1007 error_report("Error while reading offset %" PRId64 " of %s:"
1008 " %s", sectors_to_bytes(sector_num), filename1,
1009 strerror(-ret));
1010 ret = 4;
1011 goto out;
1012 }
1013 ret = bdrv_read(bs2, sector_num, buf2, nb_sectors);
1014 if (ret < 0) {
1015 error_report("Error while reading offset %" PRId64
1016 " of %s: %s", sectors_to_bytes(sector_num),
1017 filename2, strerror(-ret));
1018 ret = 4;
1019 goto out;
1020 }
1021 ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
1022 if (ret || pnum != nb_sectors) {
d14ed18c
MR
1023 qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
1024 sectors_to_bytes(
1025 ret ? sector_num : sector_num + pnum));
36452f12 1026 ret = 1;
d14ed18c
MR
1027 goto out;
1028 }
1029 }
1030 } else {
1031 if (strict) {
1032 ret = 1;
1033 qprintf(quiet, "Strict mode: Offset %" PRId64
1034 " allocation mismatch!\n",
1035 sectors_to_bytes(sector_num));
1036 goto out;
1037 }
1038
1039 if (allocated1) {
1040 ret = check_empty_sectors(bs1, sector_num, nb_sectors,
1041 filename1, buf1, quiet);
1042 } else {
1043 ret = check_empty_sectors(bs2, sector_num, nb_sectors,
1044 filename2, buf1, quiet);
1045 }
1046 if (ret) {
1047 if (ret < 0) {
d14ed18c
MR
1048 error_report("Error while reading offset %" PRId64 ": %s",
1049 sectors_to_bytes(sector_num), strerror(-ret));
36452f12 1050 ret = 4;
d14ed18c
MR
1051 }
1052 goto out;
1053 }
1054 }
1055 sector_num += nb_sectors;
1056 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1057 }
1058
1059 if (total_sectors1 != total_sectors2) {
1060 BlockDriverState *bs_over;
1061 int64_t total_sectors_over;
1062 const char *filename_over;
1063
1064 qprintf(quiet, "Warning: Image size mismatch!\n");
1065 if (total_sectors1 > total_sectors2) {
1066 total_sectors_over = total_sectors1;
1067 bs_over = bs1;
1068 filename_over = filename1;
1069 } else {
1070 total_sectors_over = total_sectors2;
1071 bs_over = bs2;
1072 filename_over = filename2;
1073 }
1074
1075 for (;;) {
1076 nb_sectors = sectors_to_process(total_sectors_over, sector_num);
1077 if (nb_sectors <= 0) {
1078 break;
1079 }
1080 ret = bdrv_is_allocated_above(bs_over, NULL, sector_num,
1081 nb_sectors, &pnum);
1082 if (ret < 0) {
1083 ret = 3;
1084 error_report("Sector allocation test failed for %s",
1085 filename_over);
1086 goto out;
1087
1088 }
1089 nb_sectors = pnum;
1090 if (ret) {
1091 ret = check_empty_sectors(bs_over, sector_num, nb_sectors,
1092 filename_over, buf1, quiet);
1093 if (ret) {
1094 if (ret < 0) {
d14ed18c
MR
1095 error_report("Error while reading offset %" PRId64
1096 " of %s: %s", sectors_to_bytes(sector_num),
1097 filename_over, strerror(-ret));
36452f12 1098 ret = 4;
d14ed18c
MR
1099 }
1100 goto out;
1101 }
1102 }
1103 sector_num += nb_sectors;
1104 qemu_progress_print(((float) nb_sectors / progress_base)*100, 100);
1105 }
1106 }
1107
1108 qprintf(quiet, "Images are identical.\n");
1109 ret = 0;
1110
1111out:
4f6fd349 1112 bdrv_unref(bs2);
d14ed18c
MR
1113 qemu_vfree(buf1);
1114 qemu_vfree(buf2);
1115out2:
4f6fd349 1116 bdrv_unref(bs1);
d14ed18c
MR
1117out3:
1118 qemu_progress_end();
1119 return ret;
1120}
1121
ea2384d3
FB
1122static int img_convert(int argc, char **argv)
1123{
b2e10493
AD
1124 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size,
1125 cluster_sectors, skip_create;
661a0f71
FS
1126 int progress = 0, flags;
1127 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
b50cbabc 1128 BlockDriver *drv, *proto_drv;
c2abccec 1129 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
1130 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
1131 uint64_t bs_sectors;
c2abccec 1132 uint8_t * buf = NULL;
ea2384d3 1133 const uint8_t *buf1;
faea38e7 1134 BlockDriverInfo bdi;
b50cbabc 1135 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 1136 QEMUOptionParameter *out_baseimg_param;
efa84d43 1137 char *options = NULL;
51ef6727 1138 const char *snapshot_name = NULL;
1f710495 1139 float local_progress = 0;
a22f123c 1140 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
f382d43a 1141 bool quiet = false;
cc84d90f 1142 Error *local_err = NULL;
ea2384d3
FB
1143
1144 fmt = NULL;
1145 out_fmt = "raw";
661a0f71 1146 cache = "unsafe";
f58c7b35 1147 out_baseimg = NULL;
eec77d9e 1148 compress = 0;
b2e10493 1149 skip_create = 0;
ea2384d3 1150 for(;;) {
b2e10493 1151 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:qn");
b8fb60da 1152 if (c == -1) {
ea2384d3 1153 break;
b8fb60da 1154 }
ea2384d3 1155 switch(c) {
ef87394c 1156 case '?':
ea2384d3
FB
1157 case 'h':
1158 help();
1159 break;
1160 case 'f':
1161 fmt = optarg;
1162 break;
1163 case 'O':
1164 out_fmt = optarg;
1165 break;
f58c7b35
TS
1166 case 'B':
1167 out_baseimg = optarg;
1168 break;
ea2384d3 1169 case 'c':
eec77d9e 1170 compress = 1;
ea2384d3
FB
1171 break;
1172 case 'e':
9d42e15d 1173 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
1174 "encryption\' instead!");
1175 return 1;
ec36ba14 1176 case '6':
9d42e15d 1177 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
1178 "compat6\' instead!");
1179 return 1;
efa84d43
KW
1180 case 'o':
1181 options = optarg;
1182 break;
51ef6727 1183 case 's':
1184 snapshot_name = optarg;
1185 break;
a22f123c
KW
1186 case 'S':
1187 {
1188 int64_t sval;
e36b3695
MA
1189 char *end;
1190 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
1191 if (sval < 0 || *end) {
a22f123c
KW
1192 error_report("Invalid minimum zero buffer size for sparse output specified");
1193 return 1;
1194 }
1195
1196 min_sparse = sval / BDRV_SECTOR_SIZE;
1197 break;
1198 }
6b837bc4
JS
1199 case 'p':
1200 progress = 1;
1201 break;
661a0f71
FS
1202 case 't':
1203 cache = optarg;
1204 break;
f382d43a
MR
1205 case 'q':
1206 quiet = true;
1207 break;
b2e10493
AD
1208 case 'n':
1209 skip_create = 1;
1210 break;
ea2384d3
FB
1211 }
1212 }
3b46e624 1213
f382d43a
MR
1214 if (quiet) {
1215 progress = 0;
1216 }
1217
926c2d23 1218 bs_n = argc - optind - 1;
b8fb60da
JS
1219 if (bs_n < 1) {
1220 help();
1221 }
926c2d23
AZ
1222
1223 out_filename = argv[argc - 1];
f58c7b35 1224
fa170c14
CA
1225 /* Initialize before goto out */
1226 qemu_progress_init(progress, 2.0);
1227
c8057f95 1228 if (options && is_help_option(options)) {
4ac8aacd
JS
1229 ret = print_block_option_help(out_filename, out_fmt);
1230 goto out;
1231 }
1232
c2abccec 1233 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
1234 error_report("-B makes no sense when concatenating multiple input "
1235 "images");
31ca34b8
JS
1236 ret = -1;
1237 goto out;
c2abccec 1238 }
f8111c24 1239
6b837bc4
JS
1240 qemu_progress_print(0, 100);
1241
7267c094 1242 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
1243
1244 total_sectors = 0;
1245 for (bs_i = 0; bs_i < bs_n; bs_i++) {
f382d43a
MR
1246 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true,
1247 quiet);
c2abccec 1248 if (!bs[bs_i]) {
15654a6d 1249 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
1250 ret = -1;
1251 goto out;
1252 }
926c2d23
AZ
1253 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1254 total_sectors += bs_sectors;
1255 }
ea2384d3 1256
51ef6727 1257 if (snapshot_name != NULL) {
1258 if (bs_n > 1) {
6daf194d 1259 error_report("No support for concatenating multiple snapshot");
51ef6727 1260 ret = -1;
1261 goto out;
1262 }
1263 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
6daf194d 1264 error_report("Failed to load snapshot");
51ef6727 1265 ret = -1;
1266 goto out;
1267 }
1268 }
1269
efa84d43 1270 /* Find driver and parse its options */
ea2384d3 1271 drv = bdrv_find_format(out_fmt);
c2abccec 1272 if (!drv) {
15654a6d 1273 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
1274 ret = -1;
1275 goto out;
1276 }
efa84d43 1277
98289620 1278 proto_drv = bdrv_find_protocol(out_filename, true);
c2abccec 1279 if (!proto_drv) {
15654a6d 1280 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
1281 ret = -1;
1282 goto out;
1283 }
b50cbabc
MK
1284
1285 create_options = append_option_parameters(create_options,
1286 drv->create_options);
1287 create_options = append_option_parameters(create_options,
1288 proto_drv->create_options);
db08adf5 1289
efa84d43 1290 if (options) {
b50cbabc 1291 param = parse_option_parameters(options, create_options, param);
efa84d43 1292 if (param == NULL) {
15654a6d 1293 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
1294 ret = -1;
1295 goto out;
efa84d43
KW
1296 }
1297 } else {
b50cbabc 1298 param = parse_option_parameters("", create_options, param);
efa84d43
KW
1299 }
1300
1301 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 1302 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
1303 if (ret < 0) {
1304 goto out;
1305 }
efa84d43 1306
a18953fb
KW
1307 /* Get backing file name if -o backing_file was used */
1308 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
1309 if (out_baseimg_param) {
1310 out_baseimg = out_baseimg_param->value.s;
1311 }
1312
efa84d43 1313 /* Check if compression is supported */
eec77d9e 1314 if (compress) {
efa84d43
KW
1315 QEMUOptionParameter *encryption =
1316 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
41521fa4
KW
1317 QEMUOptionParameter *preallocation =
1318 get_option_parameter(param, BLOCK_OPT_PREALLOC);
efa84d43
KW
1319
1320 if (!drv->bdrv_write_compressed) {
15654a6d 1321 error_report("Compression not supported for this file format");
c2abccec
MK
1322 ret = -1;
1323 goto out;
efa84d43
KW
1324 }
1325
1326 if (encryption && encryption->value.n) {
15654a6d
JS
1327 error_report("Compression and encryption not supported at "
1328 "the same time");
c2abccec
MK
1329 ret = -1;
1330 goto out;
efa84d43 1331 }
41521fa4
KW
1332
1333 if (preallocation && preallocation->value.s
1334 && strcmp(preallocation->value.s, "off"))
1335 {
1336 error_report("Compression and preallocation not supported at "
1337 "the same time");
1338 ret = -1;
1339 goto out;
1340 }
efa84d43
KW
1341 }
1342
b2e10493
AD
1343 if (!skip_create) {
1344 /* Create the new image */
cc84d90f 1345 ret = bdrv_create(drv, out_filename, param, &local_err);
b2e10493 1346 if (ret < 0) {
cc84d90f
MR
1347 error_report("%s: error while converting %s: %s",
1348 out_filename, out_fmt, error_get_pretty(local_err));
1349 error_free(local_err);
b2e10493 1350 goto out;
ea2384d3
FB
1351 }
1352 }
3b46e624 1353
661a0f71 1354 flags = BDRV_O_RDWR;
c3993cdc 1355 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
1356 if (ret < 0) {
1357 error_report("Invalid cache option: %s", cache);
1358 return -1;
1359 }
1360
f382d43a 1361 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true, quiet);
c2abccec
MK
1362 if (!out_bs) {
1363 ret = -1;
1364 goto out;
1365 }
ea2384d3 1366
926c2d23
AZ
1367 bs_i = 0;
1368 bs_offset = 0;
1369 bdrv_get_geometry(bs[0], &bs_sectors);
bb1c0597 1370 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
926c2d23 1371
b2e10493
AD
1372 if (skip_create) {
1373 int64_t output_length = bdrv_getlength(out_bs);
1374 if (output_length < 0) {
1375 error_report("unable to get output image length: %s\n",
1376 strerror(-output_length));
1377 ret = -1;
1378 goto out;
1379 } else if (output_length < total_sectors << BDRV_SECTOR_BITS) {
1380 error_report("output file is smaller than input file");
1381 ret = -1;
1382 goto out;
1383 }
1384 }
1385
eec77d9e 1386 if (compress) {
c2abccec
MK
1387 ret = bdrv_get_info(out_bs, &bdi);
1388 if (ret < 0) {
15654a6d 1389 error_report("could not get block driver info");
c2abccec
MK
1390 goto out;
1391 }
faea38e7 1392 cluster_size = bdi.cluster_size;
c2abccec 1393 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 1394 error_report("invalid cluster size");
c2abccec
MK
1395 ret = -1;
1396 goto out;
1397 }
ea2384d3
FB
1398 cluster_sectors = cluster_size >> 9;
1399 sector_num = 0;
6b837bc4
JS
1400
1401 nb_sectors = total_sectors;
1f710495
KW
1402 if (nb_sectors != 0) {
1403 local_progress = (float)100 /
1404 (nb_sectors / MIN(nb_sectors, cluster_sectors));
1405 }
6b837bc4 1406
ea2384d3 1407 for(;;) {
926c2d23
AZ
1408 int64_t bs_num;
1409 int remainder;
1410 uint8_t *buf2;
1411
ea2384d3
FB
1412 nb_sectors = total_sectors - sector_num;
1413 if (nb_sectors <= 0)
1414 break;
1415 if (nb_sectors >= cluster_sectors)
1416 n = cluster_sectors;
1417 else
1418 n = nb_sectors;
926c2d23
AZ
1419
1420 bs_num = sector_num - bs_offset;
1421 assert (bs_num >= 0);
1422 remainder = n;
1423 buf2 = buf;
1424 while (remainder > 0) {
1425 int nlow;
1426 while (bs_num == bs_sectors) {
1427 bs_i++;
1428 assert (bs_i < bs_n);
1429 bs_offset += bs_sectors;
1430 bdrv_get_geometry(bs[bs_i], &bs_sectors);
1431 bs_num = 0;
0bfcd599
BS
1432 /* printf("changing part: sector_num=%" PRId64 ", "
1433 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
1434 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
1435 }
1436 assert (bs_num < bs_sectors);
1437
1438 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
1439
c2abccec
MK
1440 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
1441 if (ret < 0) {
3fba9d81
SH
1442 error_report("error while reading sector %" PRId64 ": %s",
1443 bs_num, strerror(-ret));
c2abccec
MK
1444 goto out;
1445 }
926c2d23
AZ
1446
1447 buf2 += nlow * 512;
1448 bs_num += nlow;
1449
1450 remainder -= nlow;
1451 }
1452 assert (remainder == 0);
1453
54f106d5
SH
1454 if (!buffer_is_zero(buf, n * BDRV_SECTOR_SIZE)) {
1455 ret = bdrv_write_compressed(out_bs, sector_num, buf, n);
c2abccec 1456 if (ret != 0) {
3fba9d81
SH
1457 error_report("error while compressing sector %" PRId64
1458 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1459 goto out;
1460 }
ea2384d3
FB
1461 }
1462 sector_num += n;
6b837bc4 1463 qemu_progress_print(local_progress, 100);
ea2384d3 1464 }
faea38e7
FB
1465 /* signal EOF to align */
1466 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 1467 } else {
f2feebbd
KW
1468 int has_zero_init = bdrv_has_zero_init(out_bs);
1469
f58c7b35 1470 sector_num = 0; // total number of sectors converted so far
6b837bc4 1471 nb_sectors = total_sectors - sector_num;
1f710495
KW
1472 if (nb_sectors != 0) {
1473 local_progress = (float)100 /
1474 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
1475 }
6b837bc4 1476
ea2384d3
FB
1477 for(;;) {
1478 nb_sectors = total_sectors - sector_num;
b8fb60da 1479 if (nb_sectors <= 0) {
ea2384d3 1480 break;
b8fb60da
JS
1481 }
1482 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 1483 n = (IO_BUF_SIZE / 512);
b8fb60da 1484 } else {
ea2384d3 1485 n = nb_sectors;
b8fb60da 1486 }
926c2d23
AZ
1487
1488 while (sector_num - bs_offset >= bs_sectors) {
1489 bs_i ++;
1490 assert (bs_i < bs_n);
1491 bs_offset += bs_sectors;
1492 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
1493 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1494 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
1495 sector_num, bs_i, bs_offset, bs_sectors); */
1496 }
1497
b8fb60da 1498 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 1499 n = bs_offset + bs_sectors - sector_num;
b8fb60da 1500 }
926c2d23 1501
e4a86f88
PB
1502 /* If the output image is being created as a copy on write image,
1503 assume that sectors which are unallocated in the input image
1504 are present in both the output's and input's base images (no
1505 need to copy them). */
1506 if (out_baseimg) {
1507 ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1508 n, &n1);
1509 if (ret < 0) {
1510 error_report("error while reading metadata for sector "
1511 "%" PRId64 ": %s",
1512 sector_num - bs_offset, strerror(-ret));
1513 goto out;
1514 }
1515 if (!ret) {
1516 sector_num += n1;
1517 continue;
93c65b47 1518 }
e4a86f88
PB
1519 /* The next 'n1' sectors are allocated in the input image. Copy
1520 only those as they may be followed by unallocated sectors. */
1521 n = n1;
93c65b47
AL
1522 } else {
1523 n1 = n;
f58c7b35
TS
1524 }
1525
c2abccec
MK
1526 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1527 if (ret < 0) {
3fba9d81
SH
1528 error_report("error while reading sector %" PRId64 ": %s",
1529 sector_num - bs_offset, strerror(-ret));
c2abccec
MK
1530 goto out;
1531 }
ea2384d3
FB
1532 /* NOTE: at the same time we convert, we do not write zero
1533 sectors to have a chance to compress the image. Ideally, we
1534 should add a specific call to have the info to go faster */
1535 buf1 = buf;
1536 while (n > 0) {
11212d8f 1537 if (!has_zero_init ||
a22f123c 1538 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
c2abccec
MK
1539 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1540 if (ret < 0) {
3fba9d81
SH
1541 error_report("error while writing sector %" PRId64
1542 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1543 goto out;
1544 }
ea2384d3
FB
1545 }
1546 sector_num += n1;
1547 n -= n1;
1548 buf1 += n1 * 512;
1549 }
6b837bc4 1550 qemu_progress_print(local_progress, 100);
ea2384d3
FB
1551 }
1552 }
c2abccec 1553out:
6b837bc4 1554 qemu_progress_end();
c2abccec
MK
1555 free_option_parameters(create_options);
1556 free_option_parameters(param);
bb1c0597 1557 qemu_vfree(buf);
c2abccec 1558 if (out_bs) {
4f6fd349 1559 bdrv_unref(out_bs);
c2abccec 1560 }
31ca34b8
JS
1561 if (bs) {
1562 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1563 if (bs[bs_i]) {
4f6fd349 1564 bdrv_unref(bs[bs_i]);
31ca34b8 1565 }
c2abccec 1566 }
7267c094 1567 g_free(bs);
c2abccec 1568 }
c2abccec
MK
1569 if (ret) {
1570 return 1;
1571 }
ea2384d3
FB
1572 return 0;
1573}
1574
57d1a2b6 1575
faea38e7
FB
1576static void dump_snapshots(BlockDriverState *bs)
1577{
1578 QEMUSnapshotInfo *sn_tab, *sn;
1579 int nb_sns, i;
faea38e7
FB
1580
1581 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1582 if (nb_sns <= 0)
1583 return;
1584 printf("Snapshot list:\n");
5b917044
WX
1585 bdrv_snapshot_dump(fprintf, stdout, NULL);
1586 printf("\n");
faea38e7
FB
1587 for(i = 0; i < nb_sns; i++) {
1588 sn = &sn_tab[i];
5b917044
WX
1589 bdrv_snapshot_dump(fprintf, stdout, sn);
1590 printf("\n");
faea38e7 1591 }
7267c094 1592 g_free(sn_tab);
faea38e7
FB
1593}
1594
9699bf0d
SH
1595static void dump_json_image_info_list(ImageInfoList *list)
1596{
1597 Error *errp = NULL;
1598 QString *str;
1599 QmpOutputVisitor *ov = qmp_output_visitor_new();
1600 QObject *obj;
1601 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1602 &list, NULL, &errp);
1603 obj = qmp_output_get_qobject(ov);
1604 str = qobject_to_json_pretty(obj);
1605 assert(str != NULL);
1606 printf("%s\n", qstring_get_str(str));
1607 qobject_decref(obj);
1608 qmp_output_visitor_cleanup(ov);
1609 QDECREF(str);
1610}
1611
c054b3fd
BC
1612static void dump_json_image_info(ImageInfo *info)
1613{
1614 Error *errp = NULL;
1615 QString *str;
1616 QmpOutputVisitor *ov = qmp_output_visitor_new();
1617 QObject *obj;
1618 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1619 &info, NULL, &errp);
1620 obj = qmp_output_get_qobject(ov);
1621 str = qobject_to_json_pretty(obj);
1622 assert(str != NULL);
1623 printf("%s\n", qstring_get_str(str));
1624 qobject_decref(obj);
1625 qmp_output_visitor_cleanup(ov);
1626 QDECREF(str);
1627}
1628
9699bf0d
SH
1629static void dump_human_image_info_list(ImageInfoList *list)
1630{
1631 ImageInfoList *elem;
1632 bool delim = false;
1633
1634 for (elem = list; elem; elem = elem->next) {
1635 if (delim) {
1636 printf("\n");
1637 }
1638 delim = true;
1639
5b917044 1640 bdrv_image_info_dump(fprintf, stdout, elem->value);
9699bf0d
SH
1641 }
1642}
1643
1644static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1645{
1646 return strcmp(a, b) == 0;
1647}
1648
1649/**
1650 * Open an image file chain and return an ImageInfoList
1651 *
1652 * @filename: topmost image filename
1653 * @fmt: topmost image format (may be NULL to autodetect)
1654 * @chain: true - enumerate entire backing file chain
1655 * false - only topmost image file
1656 *
1657 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1658 * image file. If there was an error a message will have been printed to
1659 * stderr.
1660 */
1661static ImageInfoList *collect_image_info_list(const char *filename,
1662 const char *fmt,
1663 bool chain)
1664{
1665 ImageInfoList *head = NULL;
1666 ImageInfoList **last = &head;
1667 GHashTable *filenames;
43526ec8 1668 Error *err = NULL;
9699bf0d
SH
1669
1670 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1671
1672 while (filename) {
1673 BlockDriverState *bs;
1674 ImageInfo *info;
1675 ImageInfoList *elem;
1676
1677 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1678 error_report("Backing file '%s' creates an infinite loop.",
1679 filename);
1680 goto err;
1681 }
1682 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1683
1684 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
f382d43a 1685 false, false);
9699bf0d
SH
1686 if (!bs) {
1687 goto err;
1688 }
1689
43526ec8
WX
1690 bdrv_query_image_info(bs, &info, &err);
1691 if (error_is_set(&err)) {
1692 error_report("%s", error_get_pretty(err));
1693 error_free(err);
1694 goto err;
fb0ed453 1695 }
9699bf0d
SH
1696
1697 elem = g_new0(ImageInfoList, 1);
1698 elem->value = info;
1699 *last = elem;
1700 last = &elem->next;
1701
4f6fd349 1702 bdrv_unref(bs);
9699bf0d
SH
1703
1704 filename = fmt = NULL;
1705 if (chain) {
1706 if (info->has_full_backing_filename) {
1707 filename = info->full_backing_filename;
1708 } else if (info->has_backing_filename) {
1709 filename = info->backing_filename;
1710 }
1711 if (info->has_backing_filename_format) {
1712 fmt = info->backing_filename_format;
1713 }
1714 }
1715 }
1716 g_hash_table_destroy(filenames);
1717 return head;
1718
1719err:
1720 qapi_free_ImageInfoList(head);
1721 g_hash_table_destroy(filenames);
1722 return NULL;
1723}
1724
c054b3fd
BC
1725static int img_info(int argc, char **argv)
1726{
1727 int c;
1728 OutputFormat output_format = OFORMAT_HUMAN;
9699bf0d 1729 bool chain = false;
c054b3fd 1730 const char *filename, *fmt, *output;
9699bf0d 1731 ImageInfoList *list;
c054b3fd 1732
ea2384d3 1733 fmt = NULL;
c054b3fd 1734 output = NULL;
ea2384d3 1735 for(;;) {
c054b3fd
BC
1736 int option_index = 0;
1737 static const struct option long_options[] = {
1738 {"help", no_argument, 0, 'h'},
1739 {"format", required_argument, 0, 'f'},
1740 {"output", required_argument, 0, OPTION_OUTPUT},
9699bf0d 1741 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
c054b3fd
BC
1742 {0, 0, 0, 0}
1743 };
1744 c = getopt_long(argc, argv, "f:h",
1745 long_options, &option_index);
b8fb60da 1746 if (c == -1) {
ea2384d3 1747 break;
b8fb60da 1748 }
ea2384d3 1749 switch(c) {
ef87394c 1750 case '?':
ea2384d3
FB
1751 case 'h':
1752 help();
1753 break;
1754 case 'f':
1755 fmt = optarg;
1756 break;
c054b3fd
BC
1757 case OPTION_OUTPUT:
1758 output = optarg;
1759 break;
9699bf0d
SH
1760 case OPTION_BACKING_CHAIN:
1761 chain = true;
1762 break;
ea2384d3
FB
1763 }
1764 }
fc11eb26 1765 if (optind != argc - 1) {
ea2384d3 1766 help();
b8fb60da 1767 }
ea2384d3
FB
1768 filename = argv[optind++];
1769
c054b3fd
BC
1770 if (output && !strcmp(output, "json")) {
1771 output_format = OFORMAT_JSON;
1772 } else if (output && !strcmp(output, "human")) {
1773 output_format = OFORMAT_HUMAN;
1774 } else if (output) {
1775 error_report("--output must be used with human or json as argument.");
c2abccec
MK
1776 return 1;
1777 }
c054b3fd 1778
9699bf0d
SH
1779 list = collect_image_info_list(filename, fmt, chain);
1780 if (!list) {
c2abccec 1781 return 1;
faea38e7 1782 }
c054b3fd 1783
c054b3fd
BC
1784 switch (output_format) {
1785 case OFORMAT_HUMAN:
9699bf0d 1786 dump_human_image_info_list(list);
c054b3fd
BC
1787 break;
1788 case OFORMAT_JSON:
9699bf0d
SH
1789 if (chain) {
1790 dump_json_image_info_list(list);
1791 } else {
1792 dump_json_image_info(list->value);
1793 }
c054b3fd 1794 break;
faea38e7 1795 }
c054b3fd 1796
9699bf0d 1797 qapi_free_ImageInfoList(list);
ea2384d3
FB
1798 return 0;
1799}
1800
4c93a13b
PB
1801
1802typedef struct MapEntry {
1803 int flags;
1804 int depth;
1805 int64_t start;
1806 int64_t length;
1807 int64_t offset;
1808 BlockDriverState *bs;
1809} MapEntry;
1810
1811static void dump_map_entry(OutputFormat output_format, MapEntry *e,
1812 MapEntry *next)
1813{
1814 switch (output_format) {
1815 case OFORMAT_HUMAN:
1816 if ((e->flags & BDRV_BLOCK_DATA) &&
1817 !(e->flags & BDRV_BLOCK_OFFSET_VALID)) {
1818 error_report("File contains external, encrypted or compressed clusters.");
1819 exit(1);
1820 }
1821 if ((e->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) == BDRV_BLOCK_DATA) {
1822 printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n",
1823 e->start, e->length, e->offset, e->bs->filename);
1824 }
1825 /* This format ignores the distinction between 0, ZERO and ZERO|DATA.
1826 * Modify the flags here to allow more coalescing.
1827 */
1828 if (next &&
1829 (next->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) != BDRV_BLOCK_DATA) {
1830 next->flags &= ~BDRV_BLOCK_DATA;
1831 next->flags |= BDRV_BLOCK_ZERO;
1832 }
1833 break;
1834 case OFORMAT_JSON:
1835 printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": %d,"
1836 " \"zero\": %s, \"data\": %s",
1837 (e->start == 0 ? "[" : ",\n"),
1838 e->start, e->length, e->depth,
1839 (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false",
1840 (e->flags & BDRV_BLOCK_DATA) ? "true" : "false");
1841 if (e->flags & BDRV_BLOCK_OFFSET_VALID) {
c745bfb4 1842 printf(", \"offset\": %"PRId64"", e->offset);
4c93a13b
PB
1843 }
1844 putchar('}');
1845
1846 if (!next) {
1847 printf("]\n");
1848 }
1849 break;
1850 }
1851}
1852
1853static int get_block_status(BlockDriverState *bs, int64_t sector_num,
1854 int nb_sectors, MapEntry *e)
1855{
1856 int64_t ret;
1857 int depth;
1858
1859 /* As an optimization, we could cache the current range of unallocated
1860 * clusters in each file of the chain, and avoid querying the same
1861 * range repeatedly.
1862 */
1863
1864 depth = 0;
1865 for (;;) {
1866 ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors);
1867 if (ret < 0) {
1868 return ret;
1869 }
1870 assert(nb_sectors);
1871 if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
1872 break;
1873 }
1874 bs = bs->backing_hd;
1875 if (bs == NULL) {
1876 ret = 0;
1877 break;
1878 }
1879
1880 depth++;
1881 }
1882
1883 e->start = sector_num * BDRV_SECTOR_SIZE;
1884 e->length = nb_sectors * BDRV_SECTOR_SIZE;
1885 e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK;
1886 e->offset = ret & BDRV_BLOCK_OFFSET_MASK;
1887 e->depth = depth;
1888 e->bs = bs;
1889 return 0;
1890}
1891
1892static int img_map(int argc, char **argv)
1893{
1894 int c;
1895 OutputFormat output_format = OFORMAT_HUMAN;
1896 BlockDriverState *bs;
1897 const char *filename, *fmt, *output;
1898 int64_t length;
1899 MapEntry curr = { .length = 0 }, next;
1900 int ret = 0;
1901
1902 fmt = NULL;
1903 output = NULL;
1904 for (;;) {
1905 int option_index = 0;
1906 static const struct option long_options[] = {
1907 {"help", no_argument, 0, 'h'},
1908 {"format", required_argument, 0, 'f'},
1909 {"output", required_argument, 0, OPTION_OUTPUT},
1910 {0, 0, 0, 0}
1911 };
1912 c = getopt_long(argc, argv, "f:h",
1913 long_options, &option_index);
1914 if (c == -1) {
1915 break;
1916 }
1917 switch (c) {
1918 case '?':
1919 case 'h':
1920 help();
1921 break;
1922 case 'f':
1923 fmt = optarg;
1924 break;
1925 case OPTION_OUTPUT:
1926 output = optarg;
1927 break;
1928 }
1929 }
1930 if (optind >= argc) {
1931 help();
1932 }
1933 filename = argv[optind++];
1934
1935 if (output && !strcmp(output, "json")) {
1936 output_format = OFORMAT_JSON;
1937 } else if (output && !strcmp(output, "human")) {
1938 output_format = OFORMAT_HUMAN;
1939 } else if (output) {
1940 error_report("--output must be used with human or json as argument.");
1941 return 1;
1942 }
1943
1944 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS, true, false);
1945 if (!bs) {
1946 return 1;
1947 }
1948
1949 if (output_format == OFORMAT_HUMAN) {
1950 printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
1951 }
1952
1953 length = bdrv_getlength(bs);
1954 while (curr.start + curr.length < length) {
1955 int64_t nsectors_left;
1956 int64_t sector_num;
1957 int n;
1958
1959 sector_num = (curr.start + curr.length) >> BDRV_SECTOR_BITS;
1960
1961 /* Probe up to 1 GiB at a time. */
1962 nsectors_left = DIV_ROUND_UP(length, BDRV_SECTOR_SIZE) - sector_num;
1963 n = MIN(1 << (30 - BDRV_SECTOR_BITS), nsectors_left);
1964 ret = get_block_status(bs, sector_num, n, &next);
1965
1966 if (ret < 0) {
1967 error_report("Could not read file metadata: %s", strerror(-ret));
1968 goto out;
1969 }
1970
1971 if (curr.length != 0 && curr.flags == next.flags &&
1972 curr.depth == next.depth &&
1973 ((curr.flags & BDRV_BLOCK_OFFSET_VALID) == 0 ||
1974 curr.offset + curr.length == next.offset)) {
1975 curr.length += next.length;
1976 continue;
1977 }
1978
1979 if (curr.length > 0) {
1980 dump_map_entry(output_format, &curr, &next);
1981 }
1982 curr = next;
1983 }
1984
1985 dump_map_entry(output_format, &curr, NULL);
1986
1987out:
1988 bdrv_unref(bs);
1989 return ret < 0;
1990}
1991
f7b4a940
AL
1992#define SNAPSHOT_LIST 1
1993#define SNAPSHOT_CREATE 2
1994#define SNAPSHOT_APPLY 3
1995#define SNAPSHOT_DELETE 4
1996
153859be 1997static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1998{
1999 BlockDriverState *bs;
2000 QEMUSnapshotInfo sn;
2001 char *filename, *snapshot_name = NULL;
c2abccec 2002 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
2003 int action = 0;
2004 qemu_timeval tv;
f382d43a 2005 bool quiet = false;
a89d89d3 2006 Error *err = NULL;
f7b4a940 2007
710da702 2008 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
f7b4a940
AL
2009 /* Parse commandline parameters */
2010 for(;;) {
f382d43a 2011 c = getopt(argc, argv, "la:c:d:hq");
b8fb60da 2012 if (c == -1) {
f7b4a940 2013 break;
b8fb60da 2014 }
f7b4a940 2015 switch(c) {
ef87394c 2016 case '?':
f7b4a940
AL
2017 case 'h':
2018 help();
153859be 2019 return 0;
f7b4a940
AL
2020 case 'l':
2021 if (action) {
2022 help();
153859be 2023 return 0;
f7b4a940
AL
2024 }
2025 action = SNAPSHOT_LIST;
f5edb014 2026 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
2027 break;
2028 case 'a':
2029 if (action) {
2030 help();
153859be 2031 return 0;
f7b4a940
AL
2032 }
2033 action = SNAPSHOT_APPLY;
2034 snapshot_name = optarg;
2035 break;
2036 case 'c':
2037 if (action) {
2038 help();
153859be 2039 return 0;
f7b4a940
AL
2040 }
2041 action = SNAPSHOT_CREATE;
2042 snapshot_name = optarg;
2043 break;
2044 case 'd':
2045 if (action) {
2046 help();
153859be 2047 return 0;
f7b4a940
AL
2048 }
2049 action = SNAPSHOT_DELETE;
2050 snapshot_name = optarg;
2051 break;
f382d43a
MR
2052 case 'q':
2053 quiet = true;
2054 break;
f7b4a940
AL
2055 }
2056 }
2057
fc11eb26 2058 if (optind != argc - 1) {
f7b4a940 2059 help();
b8fb60da 2060 }
f7b4a940
AL
2061 filename = argv[optind++];
2062
2063 /* Open the image */
f382d43a 2064 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true, quiet);
c2abccec
MK
2065 if (!bs) {
2066 return 1;
2067 }
f7b4a940
AL
2068
2069 /* Perform the requested action */
2070 switch(action) {
2071 case SNAPSHOT_LIST:
2072 dump_snapshots(bs);
2073 break;
2074
2075 case SNAPSHOT_CREATE:
2076 memset(&sn, 0, sizeof(sn));
2077 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
2078
2079 qemu_gettimeofday(&tv);
2080 sn.date_sec = tv.tv_sec;
2081 sn.date_nsec = tv.tv_usec * 1000;
2082
2083 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 2084 if (ret) {
15654a6d 2085 error_report("Could not create snapshot '%s': %d (%s)",
f7b4a940 2086 snapshot_name, ret, strerror(-ret));
b8fb60da 2087 }
f7b4a940
AL
2088 break;
2089
2090 case SNAPSHOT_APPLY:
2091 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 2092 if (ret) {
15654a6d 2093 error_report("Could not apply snapshot '%s': %d (%s)",
f7b4a940 2094 snapshot_name, ret, strerror(-ret));
b8fb60da 2095 }
f7b4a940
AL
2096 break;
2097
2098 case SNAPSHOT_DELETE:
a89d89d3
WX
2099 bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
2100 if (error_is_set(&err)) {
2101 error_report("Could not delete snapshot '%s': (%s)",
2102 snapshot_name, error_get_pretty(err));
2103 error_free(err);
2104 ret = 1;
b8fb60da 2105 }
f7b4a940
AL
2106 break;
2107 }
2108
2109 /* Cleanup */
4f6fd349 2110 bdrv_unref(bs);
c2abccec
MK
2111 if (ret) {
2112 return 1;
2113 }
153859be 2114 return 0;
f7b4a940
AL
2115}
2116
3e85c6fd
KW
2117static int img_rebase(int argc, char **argv)
2118{
c2abccec 2119 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 2120 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 2121 char *filename;
661a0f71 2122 const char *fmt, *cache, *out_basefmt, *out_baseimg;
3e85c6fd
KW
2123 int c, flags, ret;
2124 int unsafe = 0;
6b837bc4 2125 int progress = 0;
f382d43a 2126 bool quiet = false;
34b5d2c6 2127 Error *local_err = NULL;
3e85c6fd
KW
2128
2129 /* Parse commandline parameters */
e53dbee0 2130 fmt = NULL;
661a0f71 2131 cache = BDRV_DEFAULT_CACHE;
3e85c6fd
KW
2132 out_baseimg = NULL;
2133 out_basefmt = NULL;
3e85c6fd 2134 for(;;) {
f382d43a 2135 c = getopt(argc, argv, "uhf:F:b:pt:q");
b8fb60da 2136 if (c == -1) {
3e85c6fd 2137 break;
b8fb60da 2138 }
3e85c6fd 2139 switch(c) {
ef87394c 2140 case '?':
3e85c6fd
KW
2141 case 'h':
2142 help();
2143 return 0;
e53dbee0
KW
2144 case 'f':
2145 fmt = optarg;
2146 break;
3e85c6fd
KW
2147 case 'F':
2148 out_basefmt = optarg;
2149 break;
2150 case 'b':
2151 out_baseimg = optarg;
2152 break;
2153 case 'u':
2154 unsafe = 1;
2155 break;
6b837bc4
JS
2156 case 'p':
2157 progress = 1;
2158 break;
661a0f71
FS
2159 case 't':
2160 cache = optarg;
2161 break;
f382d43a
MR
2162 case 'q':
2163 quiet = true;
2164 break;
3e85c6fd
KW
2165 }
2166 }
2167
f382d43a
MR
2168 if (quiet) {
2169 progress = 0;
2170 }
2171
fc11eb26 2172 if ((optind != argc - 1) || (!unsafe && !out_baseimg)) {
3e85c6fd 2173 help();
b8fb60da 2174 }
3e85c6fd
KW
2175 filename = argv[optind++];
2176
6b837bc4
JS
2177 qemu_progress_init(progress, 2.0);
2178 qemu_progress_print(0, 100);
2179
661a0f71 2180 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
c3993cdc 2181 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
2182 if (ret < 0) {
2183 error_report("Invalid cache option: %s", cache);
2184 return -1;
2185 }
2186
3e85c6fd
KW
2187 /*
2188 * Open the images.
2189 *
2190 * Ignore the old backing file for unsafe rebase in case we want to correct
2191 * the reference to a renamed or moved backing file.
2192 */
f382d43a 2193 bs = bdrv_new_open(filename, fmt, flags, true, quiet);
c2abccec
MK
2194 if (!bs) {
2195 return 1;
2196 }
3e85c6fd
KW
2197
2198 /* Find the right drivers for the backing files */
2199 old_backing_drv = NULL;
2200 new_backing_drv = NULL;
2201
2202 if (!unsafe && bs->backing_format[0] != '\0') {
2203 old_backing_drv = bdrv_find_format(bs->backing_format);
2204 if (old_backing_drv == NULL) {
15654a6d 2205 error_report("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
2206 ret = -1;
2207 goto out;
3e85c6fd
KW
2208 }
2209 }
2210
2211 if (out_basefmt != NULL) {
2212 new_backing_drv = bdrv_find_format(out_basefmt);
2213 if (new_backing_drv == NULL) {
15654a6d 2214 error_report("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
2215 ret = -1;
2216 goto out;
3e85c6fd
KW
2217 }
2218 }
2219
2220 /* For safe rebasing we need to compare old and new backing file */
2221 if (unsafe) {
2222 /* Make the compiler happy */
2223 bs_old_backing = NULL;
2224 bs_new_backing = NULL;
2225 } else {
2226 char backing_name[1024];
2227
2228 bs_old_backing = bdrv_new("old_backing");
2229 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
de9c0cec 2230 ret = bdrv_open(bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
34b5d2c6 2231 old_backing_drv, &local_err);
c2abccec 2232 if (ret) {
34b5d2c6
MR
2233 error_report("Could not open old backing file '%s': %s",
2234 backing_name, error_get_pretty(local_err));
2235 error_free(local_err);
c2abccec 2236 goto out;
3e85c6fd 2237 }
a616673d
AB
2238 if (out_baseimg[0]) {
2239 bs_new_backing = bdrv_new("new_backing");
de9c0cec 2240 ret = bdrv_open(bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
34b5d2c6 2241 new_backing_drv, &local_err);
a616673d 2242 if (ret) {
34b5d2c6
MR
2243 error_report("Could not open new backing file '%s': %s",
2244 out_baseimg, error_get_pretty(local_err));
2245 error_free(local_err);
a616673d
AB
2246 goto out;
2247 }
3e85c6fd
KW
2248 }
2249 }
2250
2251 /*
2252 * Check each unallocated cluster in the COW file. If it is unallocated,
2253 * accesses go to the backing file. We must therefore compare this cluster
2254 * in the old and new backing file, and if they differ we need to copy it
2255 * from the old backing file into the COW file.
2256 *
2257 * If qemu-img crashes during this step, no harm is done. The content of
2258 * the image is the same as the original one at any time.
2259 */
2260 if (!unsafe) {
2261 uint64_t num_sectors;
87a1b3e3 2262 uint64_t old_backing_num_sectors;
a616673d 2263 uint64_t new_backing_num_sectors = 0;
3e85c6fd 2264 uint64_t sector;
cc60e327 2265 int n;
d6771bfa
T
2266 uint8_t * buf_old;
2267 uint8_t * buf_new;
1f710495 2268 float local_progress = 0;
d6771bfa 2269
bb1c0597
KW
2270 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
2271 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
3e85c6fd
KW
2272
2273 bdrv_get_geometry(bs, &num_sectors);
87a1b3e3 2274 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
a616673d
AB
2275 if (bs_new_backing) {
2276 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
2277 }
3e85c6fd 2278
1f710495
KW
2279 if (num_sectors != 0) {
2280 local_progress = (float)100 /
2281 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2282 }
2283
3e85c6fd
KW
2284 for (sector = 0; sector < num_sectors; sector += n) {
2285
2286 /* How many sectors can we handle with the next read? */
2287 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2288 n = (IO_BUF_SIZE / 512);
2289 } else {
2290 n = num_sectors - sector;
2291 }
2292
2293 /* If the cluster is allocated, we don't need to take action */
cc60e327 2294 ret = bdrv_is_allocated(bs, sector, n, &n);
d663640c
PB
2295 if (ret < 0) {
2296 error_report("error while reading image metadata: %s",
2297 strerror(-ret));
2298 goto out;
2299 }
cc60e327 2300 if (ret) {
3e85c6fd
KW
2301 continue;
2302 }
2303
87a1b3e3
KW
2304 /*
2305 * Read old and new backing file and take into consideration that
2306 * backing files may be smaller than the COW image.
2307 */
2308 if (sector >= old_backing_num_sectors) {
2309 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2310 } else {
2311 if (sector + n > old_backing_num_sectors) {
2312 n = old_backing_num_sectors - sector;
2313 }
2314
2315 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
2316 if (ret < 0) {
2317 error_report("error while reading from old backing file");
2318 goto out;
2319 }
3e85c6fd 2320 }
87a1b3e3 2321
a616673d 2322 if (sector >= new_backing_num_sectors || !bs_new_backing) {
87a1b3e3
KW
2323 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2324 } else {
2325 if (sector + n > new_backing_num_sectors) {
2326 n = new_backing_num_sectors - sector;
2327 }
2328
2329 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
2330 if (ret < 0) {
2331 error_report("error while reading from new backing file");
2332 goto out;
2333 }
3e85c6fd
KW
2334 }
2335
2336 /* If they differ, we need to write to the COW file */
2337 uint64_t written = 0;
2338
2339 while (written < n) {
2340 int pnum;
2341
2342 if (compare_sectors(buf_old + written * 512,
60b1bd4f 2343 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
2344 {
2345 ret = bdrv_write(bs, sector + written,
2346 buf_old + written * 512, pnum);
2347 if (ret < 0) {
15654a6d 2348 error_report("Error while writing to COW image: %s",
3e85c6fd 2349 strerror(-ret));
c2abccec 2350 goto out;
3e85c6fd
KW
2351 }
2352 }
2353
2354 written += pnum;
2355 }
6b837bc4 2356 qemu_progress_print(local_progress, 100);
3e85c6fd 2357 }
d6771bfa 2358
bb1c0597
KW
2359 qemu_vfree(buf_old);
2360 qemu_vfree(buf_new);
3e85c6fd
KW
2361 }
2362
2363 /*
2364 * Change the backing file. All clusters that are different from the old
2365 * backing file are overwritten in the COW file now, so the visible content
2366 * doesn't change when we switch the backing file.
2367 */
a616673d
AB
2368 if (out_baseimg && *out_baseimg) {
2369 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2370 } else {
2371 ret = bdrv_change_backing_file(bs, NULL, NULL);
2372 }
2373
3e85c6fd 2374 if (ret == -ENOSPC) {
15654a6d
JS
2375 error_report("Could not change the backing file to '%s': No "
2376 "space left in the file header", out_baseimg);
3e85c6fd 2377 } else if (ret < 0) {
15654a6d 2378 error_report("Could not change the backing file to '%s': %s",
3e85c6fd
KW
2379 out_baseimg, strerror(-ret));
2380 }
2381
6b837bc4 2382 qemu_progress_print(100, 0);
3e85c6fd
KW
2383 /*
2384 * TODO At this point it is possible to check if any clusters that are
2385 * allocated in the COW file are the same in the backing file. If so, they
2386 * could be dropped from the COW file. Don't do this before switching the
2387 * backing file, in case of a crash this would lead to corruption.
2388 */
c2abccec 2389out:
6b837bc4 2390 qemu_progress_end();
3e85c6fd
KW
2391 /* Cleanup */
2392 if (!unsafe) {
eb863add 2393 if (bs_old_backing != NULL) {
4f6fd349 2394 bdrv_unref(bs_old_backing);
eb863add
KW
2395 }
2396 if (bs_new_backing != NULL) {
4f6fd349 2397 bdrv_unref(bs_new_backing);
eb863add 2398 }
3e85c6fd
KW
2399 }
2400
4f6fd349 2401 bdrv_unref(bs);
c2abccec
MK
2402 if (ret) {
2403 return 1;
2404 }
3e85c6fd
KW
2405 return 0;
2406}
2407
ae6b0ed6
SH
2408static int img_resize(int argc, char **argv)
2409{
2410 int c, ret, relative;
2411 const char *filename, *fmt, *size;
2412 int64_t n, total_size;
f382d43a 2413 bool quiet = false;
2a81998a 2414 BlockDriverState *bs = NULL;
20caf0f7
DXW
2415 QemuOpts *param;
2416 static QemuOptsList resize_options = {
2417 .name = "resize_options",
2418 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2419 .desc = {
2420 {
2421 .name = BLOCK_OPT_SIZE,
2422 .type = QEMU_OPT_SIZE,
2423 .help = "Virtual disk size"
2424 }, {
2425 /* end of list */
2426 }
ae6b0ed6 2427 },
ae6b0ed6
SH
2428 };
2429
e80fec7f
KW
2430 /* Remove size from argv manually so that negative numbers are not treated
2431 * as options by getopt. */
2432 if (argc < 3) {
2433 help();
2434 return 1;
2435 }
2436
2437 size = argv[--argc];
2438
2439 /* Parse getopt arguments */
ae6b0ed6
SH
2440 fmt = NULL;
2441 for(;;) {
f382d43a 2442 c = getopt(argc, argv, "f:hq");
ae6b0ed6
SH
2443 if (c == -1) {
2444 break;
2445 }
2446 switch(c) {
ef87394c 2447 case '?':
ae6b0ed6
SH
2448 case 'h':
2449 help();
2450 break;
2451 case 'f':
2452 fmt = optarg;
2453 break;
f382d43a
MR
2454 case 'q':
2455 quiet = true;
2456 break;
ae6b0ed6
SH
2457 }
2458 }
fc11eb26 2459 if (optind != argc - 1) {
ae6b0ed6
SH
2460 help();
2461 }
2462 filename = argv[optind++];
ae6b0ed6
SH
2463
2464 /* Choose grow, shrink, or absolute resize mode */
2465 switch (size[0]) {
2466 case '+':
2467 relative = 1;
2468 size++;
2469 break;
2470 case '-':
2471 relative = -1;
2472 size++;
2473 break;
2474 default:
2475 relative = 0;
2476 break;
2477 }
2478
2479 /* Parse size */
e478b448 2480 param = qemu_opts_create_nofail(&resize_options);
20caf0f7 2481 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
ae6b0ed6 2482 /* Error message already printed when size parsing fails */
2a81998a 2483 ret = -1;
20caf0f7 2484 qemu_opts_del(param);
2a81998a 2485 goto out;
ae6b0ed6 2486 }
20caf0f7
DXW
2487 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2488 qemu_opts_del(param);
ae6b0ed6 2489
f382d43a 2490 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
c2abccec 2491 if (!bs) {
2a81998a
JS
2492 ret = -1;
2493 goto out;
c2abccec 2494 }
ae6b0ed6
SH
2495
2496 if (relative) {
2497 total_size = bdrv_getlength(bs) + n * relative;
2498 } else {
2499 total_size = n;
2500 }
2501 if (total_size <= 0) {
15654a6d 2502 error_report("New image size must be positive");
c2abccec
MK
2503 ret = -1;
2504 goto out;
ae6b0ed6
SH
2505 }
2506
2507 ret = bdrv_truncate(bs, total_size);
2508 switch (ret) {
2509 case 0:
f382d43a 2510 qprintf(quiet, "Image resized.\n");
ae6b0ed6
SH
2511 break;
2512 case -ENOTSUP:
259b2173 2513 error_report("This image does not support resize");
ae6b0ed6
SH
2514 break;
2515 case -EACCES:
15654a6d 2516 error_report("Image is read-only");
ae6b0ed6
SH
2517 break;
2518 default:
15654a6d 2519 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
2520 break;
2521 }
c2abccec 2522out:
2a81998a 2523 if (bs) {
4f6fd349 2524 bdrv_unref(bs);
2a81998a 2525 }
c2abccec
MK
2526 if (ret) {
2527 return 1;
2528 }
ae6b0ed6
SH
2529 return 0;
2530}
2531
6f176b48
MR
2532static int img_amend(int argc, char **argv)
2533{
2534 int c, ret = 0;
2535 char *options = NULL;
2536 QEMUOptionParameter *create_options = NULL, *options_param = NULL;
2537 const char *fmt = NULL, *filename;
2538 bool quiet = false;
2539 BlockDriverState *bs = NULL;
2540
2541 for (;;) {
2542 c = getopt(argc, argv, "hqf:o:");
2543 if (c == -1) {
2544 break;
2545 }
2546
2547 switch (c) {
2548 case 'h':
2549 case '?':
2550 help();
2551 break;
2552 case 'o':
2553 options = optarg;
2554 break;
2555 case 'f':
2556 fmt = optarg;
2557 break;
2558 case 'q':
2559 quiet = true;
2560 break;
2561 }
2562 }
2563
2564 if (optind != argc - 1) {
2565 help();
2566 }
2567
2568 if (!options) {
2569 help();
2570 }
2571
2572 filename = argv[argc - 1];
2573
2574 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
2575 if (!bs) {
2576 error_report("Could not open image '%s'", filename);
2577 ret = -1;
2578 goto out;
2579 }
2580
2581 fmt = bs->drv->format_name;
2582
2583 if (is_help_option(options)) {
2584 ret = print_block_option_help(filename, fmt);
2585 goto out;
2586 }
2587
2588 create_options = append_option_parameters(create_options,
2589 bs->drv->create_options);
2590 options_param = parse_option_parameters(options, create_options,
2591 options_param);
2592 if (options_param == NULL) {
2593 error_report("Invalid options for file format '%s'", fmt);
2594 ret = -1;
2595 goto out;
2596 }
2597
2598 ret = bdrv_amend_options(bs, options_param);
2599 if (ret < 0) {
2600 error_report("Error while amending options: %s", strerror(-ret));
2601 goto out;
2602 }
2603
2604out:
2605 if (bs) {
2606 bdrv_unref(bs);
2607 }
2608 free_option_parameters(create_options);
2609 free_option_parameters(options_param);
2610 if (ret) {
2611 return 1;
2612 }
2613 return 0;
2614}
2615
c227f099 2616static const img_cmd_t img_cmds[] = {
153859be
SB
2617#define DEF(option, callback, arg_string) \
2618 { option, callback },
2619#include "qemu-img-cmds.h"
2620#undef DEF
2621#undef GEN_DOCS
2622 { NULL, NULL, },
2623};
2624
ea2384d3
FB
2625int main(int argc, char **argv)
2626{
c227f099 2627 const img_cmd_t *cmd;
153859be 2628 const char *cmdname;
ea2384d3 2629
526eda14
MK
2630#ifdef CONFIG_POSIX
2631 signal(SIGPIPE, SIG_IGN);
2632#endif
2633
53f76e58
KW
2634 error_set_progname(argv[0]);
2635
2592c59a 2636 qemu_init_main_loop();
ea2384d3
FB
2637 bdrv_init();
2638 if (argc < 2)
2639 help();
153859be 2640 cmdname = argv[1];
8f9b157e 2641 argc--; argv++;
153859be
SB
2642
2643 /* find the command */
2644 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2645 if (!strcmp(cmdname, cmd->name)) {
2646 return cmd->handler(argc, argv);
2647 }
ea2384d3 2648 }
153859be
SB
2649
2650 /* not found */
2651 help();
ea2384d3
FB
2652 return 0;
2653}