]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/blob - qemu-img.c
qapi-types.py: Fix enum struct sizes on i686
[lisovros/qemu_apohw.git] / qemu-img.c
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                     ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1489                                             n, &n1);
1490                     if (ret < 0) {
1491                         error_report("error while reading metadata for sector "
1492                                      "%" PRId64 ": %s",
1493                                      sector_num - bs_offset, strerror(-ret));
1494                         goto out;
1495                     }
1496                     if (!ret) {
1497                         sector_num += n1;
1498                         continue;
1499                     }
1500                     /* The next 'n1' sectors are allocated in the input image. Copy
1501                        only those as they may be followed by unallocated sectors. */
1502                     n = n1;
1503                 }
1504             } else {
1505                 n1 = n;
1506             }
1507
1508             ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1509             if (ret < 0) {
1510                 error_report("error while reading sector %" PRId64 ": %s",
1511                              sector_num - bs_offset, strerror(-ret));
1512                 goto out;
1513             }
1514             /* NOTE: at the same time we convert, we do not write zero
1515                sectors to have a chance to compress the image. Ideally, we
1516                should add a specific call to have the info to go faster */
1517             buf1 = buf;
1518             while (n > 0) {
1519                 /* If the output image is being created as a copy on write image,
1520                    copy all sectors even the ones containing only NUL bytes,
1521                    because they may differ from the sectors in the base image.
1522
1523                    If the output is to a host device, we also write out
1524                    sectors that are entirely 0, since whatever data was
1525                    already there is garbage, not 0s. */
1526                 if (!has_zero_init || out_baseimg ||
1527                     is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
1528                     ret = bdrv_write(out_bs, sector_num, buf1, n1);
1529                     if (ret < 0) {
1530                         error_report("error while writing sector %" PRId64
1531                                      ": %s", sector_num, strerror(-ret));
1532                         goto out;
1533                     }
1534                 }
1535                 sector_num += n1;
1536                 n -= n1;
1537                 buf1 += n1 * 512;
1538             }
1539             qemu_progress_print(local_progress, 100);
1540         }
1541     }
1542 out:
1543     qemu_progress_end();
1544     free_option_parameters(create_options);
1545     free_option_parameters(param);
1546     qemu_vfree(buf);
1547     if (out_bs) {
1548         bdrv_delete(out_bs);
1549     }
1550     if (bs) {
1551         for (bs_i = 0; bs_i < bs_n; bs_i++) {
1552             if (bs[bs_i]) {
1553                 bdrv_delete(bs[bs_i]);
1554             }
1555         }
1556         g_free(bs);
1557     }
1558     if (ret) {
1559         return 1;
1560     }
1561     return 0;
1562 }
1563
1564
1565 static void dump_snapshots(BlockDriverState *bs)
1566 {
1567     QEMUSnapshotInfo *sn_tab, *sn;
1568     int nb_sns, i;
1569
1570     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1571     if (nb_sns <= 0)
1572         return;
1573     printf("Snapshot list:\n");
1574     bdrv_snapshot_dump(fprintf, stdout, NULL);
1575     printf("\n");
1576     for(i = 0; i < nb_sns; i++) {
1577         sn = &sn_tab[i];
1578         bdrv_snapshot_dump(fprintf, stdout, sn);
1579         printf("\n");
1580     }
1581     g_free(sn_tab);
1582 }
1583
1584 static void dump_json_image_info_list(ImageInfoList *list)
1585 {
1586     Error *errp = NULL;
1587     QString *str;
1588     QmpOutputVisitor *ov = qmp_output_visitor_new();
1589     QObject *obj;
1590     visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1591                              &list, NULL, &errp);
1592     obj = qmp_output_get_qobject(ov);
1593     str = qobject_to_json_pretty(obj);
1594     assert(str != NULL);
1595     printf("%s\n", qstring_get_str(str));
1596     qobject_decref(obj);
1597     qmp_output_visitor_cleanup(ov);
1598     QDECREF(str);
1599 }
1600
1601 static void dump_json_image_info(ImageInfo *info)
1602 {
1603     Error *errp = NULL;
1604     QString *str;
1605     QmpOutputVisitor *ov = qmp_output_visitor_new();
1606     QObject *obj;
1607     visit_type_ImageInfo(qmp_output_get_visitor(ov),
1608                          &info, NULL, &errp);
1609     obj = qmp_output_get_qobject(ov);
1610     str = qobject_to_json_pretty(obj);
1611     assert(str != NULL);
1612     printf("%s\n", qstring_get_str(str));
1613     qobject_decref(obj);
1614     qmp_output_visitor_cleanup(ov);
1615     QDECREF(str);
1616 }
1617
1618 static void dump_human_image_info_list(ImageInfoList *list)
1619 {
1620     ImageInfoList *elem;
1621     bool delim = false;
1622
1623     for (elem = list; elem; elem = elem->next) {
1624         if (delim) {
1625             printf("\n");
1626         }
1627         delim = true;
1628
1629         bdrv_image_info_dump(fprintf, stdout, elem->value);
1630     }
1631 }
1632
1633 static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1634 {
1635     return strcmp(a, b) == 0;
1636 }
1637
1638 /**
1639  * Open an image file chain and return an ImageInfoList
1640  *
1641  * @filename: topmost image filename
1642  * @fmt: topmost image format (may be NULL to autodetect)
1643  * @chain: true  - enumerate entire backing file chain
1644  *         false - only topmost image file
1645  *
1646  * Returns a list of ImageInfo objects or NULL if there was an error opening an
1647  * image file.  If there was an error a message will have been printed to
1648  * stderr.
1649  */
1650 static ImageInfoList *collect_image_info_list(const char *filename,
1651                                               const char *fmt,
1652                                               bool chain)
1653 {
1654     ImageInfoList *head = NULL;
1655     ImageInfoList **last = &head;
1656     GHashTable *filenames;
1657     Error *err = NULL;
1658
1659     filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1660
1661     while (filename) {
1662         BlockDriverState *bs;
1663         ImageInfo *info;
1664         ImageInfoList *elem;
1665
1666         if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1667             error_report("Backing file '%s' creates an infinite loop.",
1668                          filename);
1669             goto err;
1670         }
1671         g_hash_table_insert(filenames, (gpointer)filename, NULL);
1672
1673         bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
1674                            false, false);
1675         if (!bs) {
1676             goto err;
1677         }
1678
1679         bdrv_query_image_info(bs, &info, &err);
1680         if (error_is_set(&err)) {
1681             error_report("%s", error_get_pretty(err));
1682             error_free(err);
1683             goto err;
1684         }
1685
1686         elem = g_new0(ImageInfoList, 1);
1687         elem->value = info;
1688         *last = elem;
1689         last = &elem->next;
1690
1691         bdrv_delete(bs);
1692
1693         filename = fmt = NULL;
1694         if (chain) {
1695             if (info->has_full_backing_filename) {
1696                 filename = info->full_backing_filename;
1697             } else if (info->has_backing_filename) {
1698                 filename = info->backing_filename;
1699             }
1700             if (info->has_backing_filename_format) {
1701                 fmt = info->backing_filename_format;
1702             }
1703         }
1704     }
1705     g_hash_table_destroy(filenames);
1706     return head;
1707
1708 err:
1709     qapi_free_ImageInfoList(head);
1710     g_hash_table_destroy(filenames);
1711     return NULL;
1712 }
1713
1714 static int img_info(int argc, char **argv)
1715 {
1716     int c;
1717     OutputFormat output_format = OFORMAT_HUMAN;
1718     bool chain = false;
1719     const char *filename, *fmt, *output;
1720     ImageInfoList *list;
1721
1722     fmt = NULL;
1723     output = NULL;
1724     for(;;) {
1725         int option_index = 0;
1726         static const struct option long_options[] = {
1727             {"help", no_argument, 0, 'h'},
1728             {"format", required_argument, 0, 'f'},
1729             {"output", required_argument, 0, OPTION_OUTPUT},
1730             {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
1731             {0, 0, 0, 0}
1732         };
1733         c = getopt_long(argc, argv, "f:h",
1734                         long_options, &option_index);
1735         if (c == -1) {
1736             break;
1737         }
1738         switch(c) {
1739         case '?':
1740         case 'h':
1741             help();
1742             break;
1743         case 'f':
1744             fmt = optarg;
1745             break;
1746         case OPTION_OUTPUT:
1747             output = optarg;
1748             break;
1749         case OPTION_BACKING_CHAIN:
1750             chain = true;
1751             break;
1752         }
1753     }
1754     if (optind != argc - 1) {
1755         help();
1756     }
1757     filename = argv[optind++];
1758
1759     if (output && !strcmp(output, "json")) {
1760         output_format = OFORMAT_JSON;
1761     } else if (output && !strcmp(output, "human")) {
1762         output_format = OFORMAT_HUMAN;
1763     } else if (output) {
1764         error_report("--output must be used with human or json as argument.");
1765         return 1;
1766     }
1767
1768     list = collect_image_info_list(filename, fmt, chain);
1769     if (!list) {
1770         return 1;
1771     }
1772
1773     switch (output_format) {
1774     case OFORMAT_HUMAN:
1775         dump_human_image_info_list(list);
1776         break;
1777     case OFORMAT_JSON:
1778         if (chain) {
1779             dump_json_image_info_list(list);
1780         } else {
1781             dump_json_image_info(list->value);
1782         }
1783         break;
1784     }
1785
1786     qapi_free_ImageInfoList(list);
1787     return 0;
1788 }
1789
1790 #define SNAPSHOT_LIST   1
1791 #define SNAPSHOT_CREATE 2
1792 #define SNAPSHOT_APPLY  3
1793 #define SNAPSHOT_DELETE 4
1794
1795 static int img_snapshot(int argc, char **argv)
1796 {
1797     BlockDriverState *bs;
1798     QEMUSnapshotInfo sn;
1799     char *filename, *snapshot_name = NULL;
1800     int c, ret = 0, bdrv_oflags;
1801     int action = 0;
1802     qemu_timeval tv;
1803     bool quiet = false;
1804
1805     bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
1806     /* Parse commandline parameters */
1807     for(;;) {
1808         c = getopt(argc, argv, "la:c:d:hq");
1809         if (c == -1) {
1810             break;
1811         }
1812         switch(c) {
1813         case '?':
1814         case 'h':
1815             help();
1816             return 0;
1817         case 'l':
1818             if (action) {
1819                 help();
1820                 return 0;
1821             }
1822             action = SNAPSHOT_LIST;
1823             bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1824             break;
1825         case 'a':
1826             if (action) {
1827                 help();
1828                 return 0;
1829             }
1830             action = SNAPSHOT_APPLY;
1831             snapshot_name = optarg;
1832             break;
1833         case 'c':
1834             if (action) {
1835                 help();
1836                 return 0;
1837             }
1838             action = SNAPSHOT_CREATE;
1839             snapshot_name = optarg;
1840             break;
1841         case 'd':
1842             if (action) {
1843                 help();
1844                 return 0;
1845             }
1846             action = SNAPSHOT_DELETE;
1847             snapshot_name = optarg;
1848             break;
1849         case 'q':
1850             quiet = true;
1851             break;
1852         }
1853     }
1854
1855     if (optind != argc - 1) {
1856         help();
1857     }
1858     filename = argv[optind++];
1859
1860     /* Open the image */
1861     bs = bdrv_new_open(filename, NULL, bdrv_oflags, true, quiet);
1862     if (!bs) {
1863         return 1;
1864     }
1865
1866     /* Perform the requested action */
1867     switch(action) {
1868     case SNAPSHOT_LIST:
1869         dump_snapshots(bs);
1870         break;
1871
1872     case SNAPSHOT_CREATE:
1873         memset(&sn, 0, sizeof(sn));
1874         pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1875
1876         qemu_gettimeofday(&tv);
1877         sn.date_sec = tv.tv_sec;
1878         sn.date_nsec = tv.tv_usec * 1000;
1879
1880         ret = bdrv_snapshot_create(bs, &sn);
1881         if (ret) {
1882             error_report("Could not create snapshot '%s': %d (%s)",
1883                 snapshot_name, ret, strerror(-ret));
1884         }
1885         break;
1886
1887     case SNAPSHOT_APPLY:
1888         ret = bdrv_snapshot_goto(bs, snapshot_name);
1889         if (ret) {
1890             error_report("Could not apply snapshot '%s': %d (%s)",
1891                 snapshot_name, ret, strerror(-ret));
1892         }
1893         break;
1894
1895     case SNAPSHOT_DELETE:
1896         ret = bdrv_snapshot_delete(bs, snapshot_name);
1897         if (ret) {
1898             error_report("Could not delete snapshot '%s': %d (%s)",
1899                 snapshot_name, ret, strerror(-ret));
1900         }
1901         break;
1902     }
1903
1904     /* Cleanup */
1905     bdrv_delete(bs);
1906     if (ret) {
1907         return 1;
1908     }
1909     return 0;
1910 }
1911
1912 static int img_rebase(int argc, char **argv)
1913 {
1914     BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1915     BlockDriver *old_backing_drv, *new_backing_drv;
1916     char *filename;
1917     const char *fmt, *cache, *out_basefmt, *out_baseimg;
1918     int c, flags, ret;
1919     int unsafe = 0;
1920     int progress = 0;
1921     bool quiet = false;
1922
1923     /* Parse commandline parameters */
1924     fmt = NULL;
1925     cache = BDRV_DEFAULT_CACHE;
1926     out_baseimg = NULL;
1927     out_basefmt = NULL;
1928     for(;;) {
1929         c = getopt(argc, argv, "uhf:F:b:pt:q");
1930         if (c == -1) {
1931             break;
1932         }
1933         switch(c) {
1934         case '?':
1935         case 'h':
1936             help();
1937             return 0;
1938         case 'f':
1939             fmt = optarg;
1940             break;
1941         case 'F':
1942             out_basefmt = optarg;
1943             break;
1944         case 'b':
1945             out_baseimg = optarg;
1946             break;
1947         case 'u':
1948             unsafe = 1;
1949             break;
1950         case 'p':
1951             progress = 1;
1952             break;
1953         case 't':
1954             cache = optarg;
1955             break;
1956         case 'q':
1957             quiet = true;
1958             break;
1959         }
1960     }
1961
1962     if (quiet) {
1963         progress = 0;
1964     }
1965
1966     if ((optind != argc - 1) || (!unsafe && !out_baseimg)) {
1967         help();
1968     }
1969     filename = argv[optind++];
1970
1971     qemu_progress_init(progress, 2.0);
1972     qemu_progress_print(0, 100);
1973
1974     flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1975     ret = bdrv_parse_cache_flags(cache, &flags);
1976     if (ret < 0) {
1977         error_report("Invalid cache option: %s", cache);
1978         return -1;
1979     }
1980
1981     /*
1982      * Open the images.
1983      *
1984      * Ignore the old backing file for unsafe rebase in case we want to correct
1985      * the reference to a renamed or moved backing file.
1986      */
1987     bs = bdrv_new_open(filename, fmt, flags, true, quiet);
1988     if (!bs) {
1989         return 1;
1990     }
1991
1992     /* Find the right drivers for the backing files */
1993     old_backing_drv = NULL;
1994     new_backing_drv = NULL;
1995
1996     if (!unsafe && bs->backing_format[0] != '\0') {
1997         old_backing_drv = bdrv_find_format(bs->backing_format);
1998         if (old_backing_drv == NULL) {
1999             error_report("Invalid format name: '%s'", bs->backing_format);
2000             ret = -1;
2001             goto out;
2002         }
2003     }
2004
2005     if (out_basefmt != NULL) {
2006         new_backing_drv = bdrv_find_format(out_basefmt);
2007         if (new_backing_drv == NULL) {
2008             error_report("Invalid format name: '%s'", out_basefmt);
2009             ret = -1;
2010             goto out;
2011         }
2012     }
2013
2014     /* For safe rebasing we need to compare old and new backing file */
2015     if (unsafe) {
2016         /* Make the compiler happy */
2017         bs_old_backing = NULL;
2018         bs_new_backing = NULL;
2019     } else {
2020         char backing_name[1024];
2021
2022         bs_old_backing = bdrv_new("old_backing");
2023         bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2024         ret = bdrv_open(bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
2025                         old_backing_drv);
2026         if (ret) {
2027             error_report("Could not open old backing file '%s'", backing_name);
2028             goto out;
2029         }
2030         if (out_baseimg[0]) {
2031             bs_new_backing = bdrv_new("new_backing");
2032             ret = bdrv_open(bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
2033                         new_backing_drv);
2034             if (ret) {
2035                 error_report("Could not open new backing file '%s'",
2036                              out_baseimg);
2037                 goto out;
2038             }
2039         }
2040     }
2041
2042     /*
2043      * Check each unallocated cluster in the COW file. If it is unallocated,
2044      * accesses go to the backing file. We must therefore compare this cluster
2045      * in the old and new backing file, and if they differ we need to copy it
2046      * from the old backing file into the COW file.
2047      *
2048      * If qemu-img crashes during this step, no harm is done. The content of
2049      * the image is the same as the original one at any time.
2050      */
2051     if (!unsafe) {
2052         uint64_t num_sectors;
2053         uint64_t old_backing_num_sectors;
2054         uint64_t new_backing_num_sectors = 0;
2055         uint64_t sector;
2056         int n;
2057         uint8_t * buf_old;
2058         uint8_t * buf_new;
2059         float local_progress = 0;
2060
2061         buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
2062         buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
2063
2064         bdrv_get_geometry(bs, &num_sectors);
2065         bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
2066         if (bs_new_backing) {
2067             bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
2068         }
2069
2070         if (num_sectors != 0) {
2071             local_progress = (float)100 /
2072                 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
2073         }
2074
2075         for (sector = 0; sector < num_sectors; sector += n) {
2076
2077             /* How many sectors can we handle with the next read? */
2078             if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
2079                 n = (IO_BUF_SIZE / 512);
2080             } else {
2081                 n = num_sectors - sector;
2082             }
2083
2084             /* If the cluster is allocated, we don't need to take action */
2085             ret = bdrv_is_allocated(bs, sector, n, &n);
2086             if (ret < 0) {
2087                 error_report("error while reading image metadata: %s",
2088                              strerror(-ret));
2089                 goto out;
2090             }
2091             if (ret) {
2092                 continue;
2093             }
2094
2095             /*
2096              * Read old and new backing file and take into consideration that
2097              * backing files may be smaller than the COW image.
2098              */
2099             if (sector >= old_backing_num_sectors) {
2100                 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
2101             } else {
2102                 if (sector + n > old_backing_num_sectors) {
2103                     n = old_backing_num_sectors - sector;
2104                 }
2105
2106                 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
2107                 if (ret < 0) {
2108                     error_report("error while reading from old backing file");
2109                     goto out;
2110                 }
2111             }
2112
2113             if (sector >= new_backing_num_sectors || !bs_new_backing) {
2114                 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
2115             } else {
2116                 if (sector + n > new_backing_num_sectors) {
2117                     n = new_backing_num_sectors - sector;
2118                 }
2119
2120                 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
2121                 if (ret < 0) {
2122                     error_report("error while reading from new backing file");
2123                     goto out;
2124                 }
2125             }
2126
2127             /* If they differ, we need to write to the COW file */
2128             uint64_t written = 0;
2129
2130             while (written < n) {
2131                 int pnum;
2132
2133                 if (compare_sectors(buf_old + written * 512,
2134                     buf_new + written * 512, n - written, &pnum))
2135                 {
2136                     ret = bdrv_write(bs, sector + written,
2137                         buf_old + written * 512, pnum);
2138                     if (ret < 0) {
2139                         error_report("Error while writing to COW image: %s",
2140                             strerror(-ret));
2141                         goto out;
2142                     }
2143                 }
2144
2145                 written += pnum;
2146             }
2147             qemu_progress_print(local_progress, 100);
2148         }
2149
2150         qemu_vfree(buf_old);
2151         qemu_vfree(buf_new);
2152     }
2153
2154     /*
2155      * Change the backing file. All clusters that are different from the old
2156      * backing file are overwritten in the COW file now, so the visible content
2157      * doesn't change when we switch the backing file.
2158      */
2159     if (out_baseimg && *out_baseimg) {
2160         ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
2161     } else {
2162         ret = bdrv_change_backing_file(bs, NULL, NULL);
2163     }
2164
2165     if (ret == -ENOSPC) {
2166         error_report("Could not change the backing file to '%s': No "
2167                      "space left in the file header", out_baseimg);
2168     } else if (ret < 0) {
2169         error_report("Could not change the backing file to '%s': %s",
2170             out_baseimg, strerror(-ret));
2171     }
2172
2173     qemu_progress_print(100, 0);
2174     /*
2175      * TODO At this point it is possible to check if any clusters that are
2176      * allocated in the COW file are the same in the backing file. If so, they
2177      * could be dropped from the COW file. Don't do this before switching the
2178      * backing file, in case of a crash this would lead to corruption.
2179      */
2180 out:
2181     qemu_progress_end();
2182     /* Cleanup */
2183     if (!unsafe) {
2184         if (bs_old_backing != NULL) {
2185             bdrv_delete(bs_old_backing);
2186         }
2187         if (bs_new_backing != NULL) {
2188             bdrv_delete(bs_new_backing);
2189         }
2190     }
2191
2192     bdrv_delete(bs);
2193     if (ret) {
2194         return 1;
2195     }
2196     return 0;
2197 }
2198
2199 static int img_resize(int argc, char **argv)
2200 {
2201     int c, ret, relative;
2202     const char *filename, *fmt, *size;
2203     int64_t n, total_size;
2204     bool quiet = false;
2205     BlockDriverState *bs = NULL;
2206     QemuOpts *param;
2207     static QemuOptsList resize_options = {
2208         .name = "resize_options",
2209         .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
2210         .desc = {
2211             {
2212                 .name = BLOCK_OPT_SIZE,
2213                 .type = QEMU_OPT_SIZE,
2214                 .help = "Virtual disk size"
2215             }, {
2216                 /* end of list */
2217             }
2218         },
2219     };
2220
2221     /* Remove size from argv manually so that negative numbers are not treated
2222      * as options by getopt. */
2223     if (argc < 3) {
2224         help();
2225         return 1;
2226     }
2227
2228     size = argv[--argc];
2229
2230     /* Parse getopt arguments */
2231     fmt = NULL;
2232     for(;;) {
2233         c = getopt(argc, argv, "f:hq");
2234         if (c == -1) {
2235             break;
2236         }
2237         switch(c) {
2238         case '?':
2239         case 'h':
2240             help();
2241             break;
2242         case 'f':
2243             fmt = optarg;
2244             break;
2245         case 'q':
2246             quiet = true;
2247             break;
2248         }
2249     }
2250     if (optind != argc - 1) {
2251         help();
2252     }
2253     filename = argv[optind++];
2254
2255     /* Choose grow, shrink, or absolute resize mode */
2256     switch (size[0]) {
2257     case '+':
2258         relative = 1;
2259         size++;
2260         break;
2261     case '-':
2262         relative = -1;
2263         size++;
2264         break;
2265     default:
2266         relative = 0;
2267         break;
2268     }
2269
2270     /* Parse size */
2271     param = qemu_opts_create_nofail(&resize_options);
2272     if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
2273         /* Error message already printed when size parsing fails */
2274         ret = -1;
2275         qemu_opts_del(param);
2276         goto out;
2277     }
2278     n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
2279     qemu_opts_del(param);
2280
2281     bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
2282     if (!bs) {
2283         ret = -1;
2284         goto out;
2285     }
2286
2287     if (relative) {
2288         total_size = bdrv_getlength(bs) + n * relative;
2289     } else {
2290         total_size = n;
2291     }
2292     if (total_size <= 0) {
2293         error_report("New image size must be positive");
2294         ret = -1;
2295         goto out;
2296     }
2297
2298     ret = bdrv_truncate(bs, total_size);
2299     switch (ret) {
2300     case 0:
2301         qprintf(quiet, "Image resized.\n");
2302         break;
2303     case -ENOTSUP:
2304         error_report("This image does not support resize");
2305         break;
2306     case -EACCES:
2307         error_report("Image is read-only");
2308         break;
2309     default:
2310         error_report("Error resizing image (%d)", -ret);
2311         break;
2312     }
2313 out:
2314     if (bs) {
2315         bdrv_delete(bs);
2316     }
2317     if (ret) {
2318         return 1;
2319     }
2320     return 0;
2321 }
2322
2323 static const img_cmd_t img_cmds[] = {
2324 #define DEF(option, callback, arg_string)        \
2325     { option, callback },
2326 #include "qemu-img-cmds.h"
2327 #undef DEF
2328 #undef GEN_DOCS
2329     { NULL, NULL, },
2330 };
2331
2332 int main(int argc, char **argv)
2333 {
2334     const img_cmd_t *cmd;
2335     const char *cmdname;
2336
2337 #ifdef CONFIG_POSIX
2338     signal(SIGPIPE, SIG_IGN);
2339 #endif
2340
2341     error_set_progname(argv[0]);
2342
2343     qemu_init_main_loop();
2344     bdrv_init();
2345     if (argc < 2)
2346         help();
2347     cmdname = argv[1];
2348     argc--; argv++;
2349
2350     /* find the command */
2351     for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2352         if (!strcmp(cmdname, cmd->name)) {
2353             return cmd->handler(argc, argv);
2354         }
2355     }
2356
2357     /* not found */
2358     help();
2359     return 0;
2360 }