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