]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
qemu-img: img_create(): pass Error object to bdrv_img_create()
[qemu.git] / qemu-img.c
CommitLineData
ea2384d3 1/*
fb43f4dd 2 * QEMU disk image utility
5fafdf24 3 *
68d0f70e 4 * Copyright (c) 2003-2008 Fabrice Bellard
5fafdf24 5 *
ea2384d3
FB
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
c054b3fd
BC
24#include "qapi-visit.h"
25#include "qapi/qmp-output-visitor.h"
26#include "qjson.h"
faf07963 27#include "qemu-common.h"
9ea2ea71 28#include "qemu-option.h"
53f76e58 29#include "qemu-error.h"
f7b4a940 30#include "osdep.h"
dc786bc9 31#include "sysemu.h"
ec36ba14 32#include "block_int.h"
c054b3fd 33#include <getopt.h>
9230eaf6 34#include <stdio.h>
ea2384d3 35
e8445331
FB
36#ifdef _WIN32
37#include <windows.h>
38#endif
39
c227f099 40typedef struct img_cmd_t {
153859be
SB
41 const char *name;
42 int (*handler)(int argc, char **argv);
c227f099 43} img_cmd_t;
153859be 44
137519ce 45/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
adfe078e 46#define BDRV_O_FLAGS BDRV_O_CACHE_WB
661a0f71 47#define BDRV_DEFAULT_CACHE "writeback"
137519ce 48
ea2384d3
FB
49static void format_print(void *opaque, const char *name)
50{
51 printf(" %s", name);
52}
53
d2c639d6 54/* Please keep in synch with qemu-img.texi */
3f379ab1 55static void help(void)
ea2384d3 56{
e00291c0
PB
57 const char *help_msg =
58 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
3f020d70 59 "usage: qemu-img command [command options]\n"
60 "QEMU disk image utility\n"
61 "\n"
62 "Command syntax:\n"
153859be
SB
63#define DEF(option, callback, arg_string) \
64 " " arg_string "\n"
65#include "qemu-img-cmds.h"
66#undef DEF
67#undef GEN_DOCS
3f020d70 68 "\n"
69 "Command parameters:\n"
70 " 'filename' is a disk image filename\n"
71 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
661a0f71 72 " 'cache' is the cache mode used to write the output disk image, the valid\n"
80ccf93b
LY
73 " options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n"
74 " 'directsync' and 'unsafe' (default for convert)\n"
3f020d70 75 " 'size' is the disk image size in bytes. Optional suffixes\n"
76 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
77 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
78 " 'output_filename' is the destination disk image filename\n"
79 " 'output_fmt' is the destination format\n"
80 " 'options' is a comma separated list of format specific options in a\n"
81 " name=value format. Use -o ? for an overview of the options supported by the\n"
82 " used format\n"
83 " '-c' indicates that target image must be compressed (qcow format only)\n"
84 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
85 " match exactly. The image doesn't need a working backing file before\n"
86 " rebasing in this case (useful for renaming the backing file)\n"
87 " '-h' with or without a command shows this help and lists the supported formats\n"
6b837bc4 88 " '-p' show progress of command (only certain commands)\n"
a22f123c
KW
89 " '-S' indicates the consecutive number of bytes that must contain only zeros\n"
90 " for qemu-img to create a sparse image during conversion\n"
c054b3fd 91 " '--output' takes the format in which the output must be done (human or json)\n"
3f020d70 92 "\n"
4534ff54
KW
93 "Parameters to check subcommand:\n"
94 " '-r' tries to repair any inconsistencies that are found during the check.\n"
95 " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n"
96 " kinds of errors, with a higher risk of choosing the wrong fix or\n"
0546b8c2 97 " hiding corruption that has already occurred.\n"
4534ff54 98 "\n"
3f020d70 99 "Parameters to snapshot subcommand:\n"
100 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
101 " '-a' applies a snapshot (revert disk to saved state)\n"
102 " '-c' creates a snapshot\n"
103 " '-d' deletes a snapshot\n"
e00291c0
PB
104 " '-l' lists all snapshots in the given image\n";
105
106 printf("%s\nSupported formats:", help_msg);
ea2384d3
FB
107 bdrv_iterate_format(format_print, NULL);
108 printf("\n");
109 exit(1);
110}
111
ea2384d3
FB
112#if defined(WIN32)
113/* XXX: put correct support for win32 */
114static int read_password(char *buf, int buf_size)
115{
116 int c, i;
117 printf("Password: ");
118 fflush(stdout);
119 i = 0;
120 for(;;) {
121 c = getchar();
122 if (c == '\n')
123 break;
124 if (i < (buf_size - 1))
125 buf[i++] = c;
126 }
127 buf[i] = '\0';
128 return 0;
129}
130
131#else
132
133#include <termios.h>
134
135static struct termios oldtty;
136
137static void term_exit(void)
138{
139 tcsetattr (0, TCSANOW, &oldtty);
140}
141
142static void term_init(void)
143{
144 struct termios tty;
145
146 tcgetattr (0, &tty);
147 oldtty = tty;
148
149 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
150 |INLCR|IGNCR|ICRNL|IXON);
151 tty.c_oflag |= OPOST;
152 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
153 tty.c_cflag &= ~(CSIZE|PARENB);
154 tty.c_cflag |= CS8;
155 tty.c_cc[VMIN] = 1;
156 tty.c_cc[VTIME] = 0;
3b46e624 157
ea2384d3
FB
158 tcsetattr (0, TCSANOW, &tty);
159
160 atexit(term_exit);
161}
162
3f379ab1 163static int read_password(char *buf, int buf_size)
ea2384d3
FB
164{
165 uint8_t ch;
166 int i, ret;
167
168 printf("password: ");
169 fflush(stdout);
170 term_init();
171 i = 0;
172 for(;;) {
173 ret = read(0, &ch, 1);
174 if (ret == -1) {
175 if (errno == EAGAIN || errno == EINTR) {
176 continue;
177 } else {
178 ret = -1;
179 break;
180 }
181 } else if (ret == 0) {
182 ret = -1;
183 break;
184 } else {
185 if (ch == '\r') {
186 ret = 0;
187 break;
188 }
189 if (i < (buf_size - 1))
190 buf[i++] = ch;
191 }
192 }
193 term_exit();
194 buf[i] = '\0';
195 printf("\n");
196 return ret;
197}
198#endif
199
4ac8aacd
JS
200static int print_block_option_help(const char *filename, const char *fmt)
201{
202 BlockDriver *drv, *proto_drv;
203 QEMUOptionParameter *create_options = NULL;
204
205 /* Find driver and parse its options */
206 drv = bdrv_find_format(fmt);
207 if (!drv) {
15654a6d 208 error_report("Unknown file format '%s'", fmt);
4ac8aacd
JS
209 return 1;
210 }
211
212 proto_drv = bdrv_find_protocol(filename);
213 if (!proto_drv) {
15654a6d 214 error_report("Unknown protocol '%s'", filename);
4ac8aacd
JS
215 return 1;
216 }
217
218 create_options = append_option_parameters(create_options,
219 drv->create_options);
220 create_options = append_option_parameters(create_options,
221 proto_drv->create_options);
222 print_option_help(create_options);
223 free_option_parameters(create_options);
224 return 0;
225}
226
75c23805 227static BlockDriverState *bdrv_new_open(const char *filename,
9bc378c1 228 const char *fmt,
f0536bb8
DB
229 int flags,
230 bool require_io)
75c23805
FB
231{
232 BlockDriverState *bs;
233 BlockDriver *drv;
234 char password[256];
b9eaf9ec 235 int ret;
75c23805 236
b9eaf9ec 237 bs = bdrv_new("image");
ad717139 238
75c23805
FB
239 if (fmt) {
240 drv = bdrv_find_format(fmt);
c2abccec 241 if (!drv) {
15654a6d 242 error_report("Unknown file format '%s'", fmt);
c2abccec
MK
243 goto fail;
244 }
75c23805
FB
245 } else {
246 drv = NULL;
247 }
b9eaf9ec
KW
248
249 ret = bdrv_open(bs, filename, flags, drv);
250 if (ret < 0) {
251 error_report("Could not open '%s': %s", filename, strerror(-ret));
c2abccec 252 goto fail;
75c23805 253 }
b9eaf9ec 254
f0536bb8 255 if (bdrv_is_encrypted(bs) && require_io) {
75c23805 256 printf("Disk image '%s' is encrypted.\n", filename);
c2abccec 257 if (read_password(password, sizeof(password)) < 0) {
15654a6d 258 error_report("No password given");
c2abccec
MK
259 goto fail;
260 }
261 if (bdrv_set_key(bs, password) < 0) {
15654a6d 262 error_report("invalid password");
c2abccec
MK
263 goto fail;
264 }
75c23805
FB
265 }
266 return bs;
c2abccec
MK
267fail:
268 if (bs) {
269 bdrv_delete(bs);
270 }
271 return NULL;
75c23805
FB
272}
273
c2abccec 274static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
275 const char *base_filename,
276 const char *base_fmt)
efa84d43 277{
efa84d43
KW
278 if (base_filename) {
279 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
15654a6d
JS
280 error_report("Backing file not supported for file format '%s'",
281 fmt);
c2abccec 282 return -1;
efa84d43
KW
283 }
284 }
285 if (base_fmt) {
286 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
15654a6d
JS
287 error_report("Backing file format not supported for file "
288 "format '%s'", fmt);
c2abccec 289 return -1;
efa84d43
KW
290 }
291 }
c2abccec 292 return 0;
efa84d43
KW
293}
294
ea2384d3
FB
295static int img_create(int argc, char **argv)
296{
eec77d9e 297 int c, ret = 0;
1da7cfbd 298 uint64_t img_size = -1;
ea2384d3 299 const char *fmt = "raw";
9230eaf6 300 const char *base_fmt = NULL;
ea2384d3
FB
301 const char *filename;
302 const char *base_filename = NULL;
9ea2ea71 303 char *options = NULL;
9b37525a 304 Error *local_err = NULL;
3b46e624 305
ea2384d3 306 for(;;) {
9ea2ea71 307 c = getopt(argc, argv, "F:b:f:he6o:");
b8fb60da 308 if (c == -1) {
ea2384d3 309 break;
b8fb60da 310 }
ea2384d3 311 switch(c) {
ef87394c 312 case '?':
ea2384d3
FB
313 case 'h':
314 help();
315 break;
9230eaf6
AL
316 case 'F':
317 base_fmt = optarg;
318 break;
ea2384d3
FB
319 case 'b':
320 base_filename = optarg;
321 break;
322 case 'f':
323 fmt = optarg;
324 break;
325 case 'e':
9d42e15d 326 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
327 "encryption\' instead!");
328 return 1;
d8871c5a 329 case '6':
9d42e15d 330 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
331 "compat6\' instead!");
332 return 1;
9ea2ea71
KW
333 case 'o':
334 options = optarg;
335 break;
ea2384d3
FB
336 }
337 }
9230eaf6 338
b50cbabc 339 /* Get the filename */
b8fb60da 340 if (optind >= argc) {
b50cbabc 341 help();
b8fb60da 342 }
b50cbabc
MK
343 filename = argv[optind++];
344
1da7cfbd
JS
345 /* Get image size, if specified */
346 if (optind < argc) {
70b4f4bb 347 int64_t sval;
e36b3695
MA
348 char *end;
349 sval = strtosz_suffix(argv[optind++], &end, STRTOSZ_DEFSUFFIX_B);
350 if (sval < 0 || *end) {
15654a6d 351 error_report("Invalid image size specified! You may use k, M, G or "
1da7cfbd 352 "T suffixes for ");
15654a6d 353 error_report("kilobytes, megabytes, gigabytes and terabytes.");
1da7cfbd
JS
354 ret = -1;
355 goto out;
356 }
357 img_size = (uint64_t)sval;
358 }
359
c8057f95 360 if (options && is_help_option(options)) {
4ac8aacd
JS
361 ret = print_block_option_help(filename, fmt);
362 goto out;
363 }
364
9b37525a
LC
365 bdrv_img_create(filename, fmt, base_filename, base_fmt,
366 options, img_size, BDRV_O_FLAGS, &local_err);
367 if (error_is_set(&local_err)) {
368 error_report("%s", error_get_pretty(local_err));
369 error_free(local_err);
370 ret = -1;
371 }
372
c2abccec
MK
373out:
374 if (ret) {
375 return 1;
376 }
ea2384d3
FB
377 return 0;
378}
379
e076f338
KW
380/*
381 * Checks an image for consistency. Exit codes:
382 *
383 * 0 - Check completed, image is good
384 * 1 - Check not completed because of internal errors
385 * 2 - Check completed, image is corrupted
386 * 3 - Check completed, image has leaked clusters, but is good otherwise
387 */
1585969c
AL
388static int img_check(int argc, char **argv)
389{
390 int c, ret;
391 const char *filename, *fmt;
1585969c 392 BlockDriverState *bs;
e076f338 393 BdrvCheckResult result;
4534ff54 394 int fix = 0;
058f8f16 395 int flags = BDRV_O_FLAGS | BDRV_O_CHECK;
1585969c
AL
396
397 fmt = NULL;
398 for(;;) {
4534ff54 399 c = getopt(argc, argv, "f:hr:");
b8fb60da 400 if (c == -1) {
1585969c 401 break;
b8fb60da 402 }
1585969c 403 switch(c) {
ef87394c 404 case '?':
1585969c
AL
405 case 'h':
406 help();
407 break;
408 case 'f':
409 fmt = optarg;
410 break;
4534ff54
KW
411 case 'r':
412 flags |= BDRV_O_RDWR;
413
414 if (!strcmp(optarg, "leaks")) {
415 fix = BDRV_FIX_LEAKS;
416 } else if (!strcmp(optarg, "all")) {
417 fix = BDRV_FIX_LEAKS | BDRV_FIX_ERRORS;
418 } else {
419 help();
420 }
421 break;
1585969c
AL
422 }
423 }
b8fb60da 424 if (optind >= argc) {
1585969c 425 help();
b8fb60da 426 }
1585969c
AL
427 filename = argv[optind++];
428
f0536bb8 429 bs = bdrv_new_open(filename, fmt, flags, true);
c2abccec
MK
430 if (!bs) {
431 return 1;
432 }
4534ff54 433 ret = bdrv_check(bs, &result, fix);
e076f338
KW
434
435 if (ret == -ENOTSUP) {
15654a6d 436 error_report("This image format does not support checks");
e076f338
KW
437 bdrv_delete(bs);
438 return 1;
439 }
440
ccf34716
KW
441 if (result.corruptions_fixed || result.leaks_fixed) {
442 printf("The following inconsistencies were found and repaired:\n\n"
443 " %d leaked clusters\n"
444 " %d corruptions\n\n"
445 "Double checking the fixed image now...\n",
446 result.leaks_fixed,
447 result.corruptions_fixed);
448 ret = bdrv_check(bs, &result, 0);
449 }
450
e076f338
KW
451 if (!(result.corruptions || result.leaks || result.check_errors)) {
452 printf("No errors were found on the image.\n");
453 } else {
454 if (result.corruptions) {
455 printf("\n%d errors were found on the image.\n"
456 "Data may be corrupted, or further writes to the image "
457 "may corrupt it.\n",
458 result.corruptions);
459 }
460
461 if (result.leaks) {
462 printf("\n%d leaked clusters were found on the image.\n"
463 "This means waste of disk space, but no harm to data.\n",
464 result.leaks);
465 }
466
467 if (result.check_errors) {
468 printf("\n%d internal errors have occurred during the check.\n",
469 result.check_errors);
1585969c 470 }
1585969c
AL
471 }
472
f8111c24
DXW
473 if (result.bfi.total_clusters != 0 && result.bfi.allocated_clusters != 0) {
474 printf("%" PRId64 "/%" PRId64 "= %0.2f%% allocated, %0.2f%% fragmented\n",
475 result.bfi.allocated_clusters, result.bfi.total_clusters,
476 result.bfi.allocated_clusters * 100.0 / result.bfi.total_clusters,
477 result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
478 }
479
1585969c 480 bdrv_delete(bs);
e076f338
KW
481
482 if (ret < 0 || result.check_errors) {
483 printf("\nAn error has occurred during the check: %s\n"
484 "The check is not complete and may have missed error.\n",
485 strerror(-ret));
c2abccec
MK
486 return 1;
487 }
e076f338
KW
488
489 if (result.corruptions) {
490 return 2;
491 } else if (result.leaks) {
492 return 3;
493 } else {
494 return 0;
495 }
1585969c
AL
496}
497
ea2384d3
FB
498static int img_commit(int argc, char **argv)
499{
661a0f71
FS
500 int c, ret, flags;
501 const char *filename, *fmt, *cache;
ea2384d3
FB
502 BlockDriverState *bs;
503
504 fmt = NULL;
661a0f71 505 cache = BDRV_DEFAULT_CACHE;
ea2384d3 506 for(;;) {
661a0f71 507 c = getopt(argc, argv, "f:ht:");
b8fb60da 508 if (c == -1) {
ea2384d3 509 break;
b8fb60da 510 }
ea2384d3 511 switch(c) {
ef87394c 512 case '?':
ea2384d3
FB
513 case 'h':
514 help();
515 break;
516 case 'f':
517 fmt = optarg;
518 break;
661a0f71
FS
519 case 't':
520 cache = optarg;
521 break;
ea2384d3
FB
522 }
523 }
b8fb60da 524 if (optind >= argc) {
ea2384d3 525 help();
b8fb60da 526 }
ea2384d3
FB
527 filename = argv[optind++];
528
661a0f71 529 flags = BDRV_O_RDWR;
c3993cdc 530 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
531 if (ret < 0) {
532 error_report("Invalid cache option: %s", cache);
533 return -1;
534 }
535
f0536bb8 536 bs = bdrv_new_open(filename, fmt, flags, true);
c2abccec
MK
537 if (!bs) {
538 return 1;
539 }
ea2384d3
FB
540 ret = bdrv_commit(bs);
541 switch(ret) {
542 case 0:
543 printf("Image committed.\n");
544 break;
545 case -ENOENT:
15654a6d 546 error_report("No disk inserted");
ea2384d3
FB
547 break;
548 case -EACCES:
15654a6d 549 error_report("Image is read-only");
ea2384d3
FB
550 break;
551 case -ENOTSUP:
15654a6d 552 error_report("Image is already committed");
ea2384d3
FB
553 break;
554 default:
15654a6d 555 error_report("Error while committing image");
ea2384d3
FB
556 break;
557 }
558
559 bdrv_delete(bs);
c2abccec
MK
560 if (ret) {
561 return 1;
562 }
ea2384d3
FB
563 return 0;
564}
565
f58c7b35
TS
566/*
567 * Returns true iff the first sector pointed to by 'buf' contains at least
568 * a non-NUL byte.
569 *
570 * 'pnum' is set to the number of sectors (including and immediately following
571 * the first one) that are known to be in the same allocated/unallocated state.
572 */
ea2384d3
FB
573static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
574{
1a6d39fd
SH
575 bool is_zero;
576 int i;
ea2384d3
FB
577
578 if (n <= 0) {
579 *pnum = 0;
580 return 0;
581 }
1a6d39fd 582 is_zero = buffer_is_zero(buf, 512);
ea2384d3
FB
583 for(i = 1; i < n; i++) {
584 buf += 512;
1a6d39fd 585 if (is_zero != buffer_is_zero(buf, 512)) {
ea2384d3 586 break;
1a6d39fd 587 }
ea2384d3
FB
588 }
589 *pnum = i;
1a6d39fd 590 return !is_zero;
ea2384d3
FB
591}
592
a22f123c
KW
593/*
594 * Like is_allocated_sectors, but if the buffer starts with a used sector,
595 * up to 'min' consecutive sectors containing zeros are ignored. This avoids
596 * breaking up write requests for only small sparse areas.
597 */
598static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum,
599 int min)
600{
601 int ret;
602 int num_checked, num_used;
603
604 if (n < min) {
605 min = n;
606 }
607
608 ret = is_allocated_sectors(buf, n, pnum);
609 if (!ret) {
610 return ret;
611 }
612
613 num_used = *pnum;
614 buf += BDRV_SECTOR_SIZE * *pnum;
615 n -= *pnum;
616 num_checked = num_used;
617
618 while (n > 0) {
619 ret = is_allocated_sectors(buf, n, pnum);
620
621 buf += BDRV_SECTOR_SIZE * *pnum;
622 n -= *pnum;
623 num_checked += *pnum;
624 if (ret) {
625 num_used = num_checked;
626 } else if (*pnum >= min) {
627 break;
628 }
629 }
630
631 *pnum = num_used;
632 return 1;
633}
634
3e85c6fd
KW
635/*
636 * Compares two buffers sector by sector. Returns 0 if the first sector of both
637 * buffers matches, non-zero otherwise.
638 *
639 * pnum is set to the number of sectors (including and immediately following
640 * the first one) that are known to have the same comparison result
641 */
642static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
643 int *pnum)
644{
645 int res, i;
646
647 if (n <= 0) {
648 *pnum = 0;
649 return 0;
650 }
651
652 res = !!memcmp(buf1, buf2, 512);
653 for(i = 1; i < n; i++) {
654 buf1 += 512;
655 buf2 += 512;
656
657 if (!!memcmp(buf1, buf2, 512) != res) {
658 break;
659 }
660 }
661
662 *pnum = i;
663 return res;
664}
665
80ee15a6 666#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3
FB
667
668static int img_convert(int argc, char **argv)
669{
eec77d9e 670 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
661a0f71
FS
671 int progress = 0, flags;
672 const char *fmt, *out_fmt, *cache, *out_baseimg, *out_filename;
b50cbabc 673 BlockDriver *drv, *proto_drv;
c2abccec 674 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
675 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
676 uint64_t bs_sectors;
c2abccec 677 uint8_t * buf = NULL;
ea2384d3 678 const uint8_t *buf1;
faea38e7 679 BlockDriverInfo bdi;
b50cbabc 680 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 681 QEMUOptionParameter *out_baseimg_param;
efa84d43 682 char *options = NULL;
51ef6727 683 const char *snapshot_name = NULL;
1f710495 684 float local_progress = 0;
a22f123c 685 int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
ea2384d3
FB
686
687 fmt = NULL;
688 out_fmt = "raw";
661a0f71 689 cache = "unsafe";
f58c7b35 690 out_baseimg = NULL;
eec77d9e 691 compress = 0;
ea2384d3 692 for(;;) {
a22f123c 693 c = getopt(argc, argv, "f:O:B:s:hce6o:pS:t:");
b8fb60da 694 if (c == -1) {
ea2384d3 695 break;
b8fb60da 696 }
ea2384d3 697 switch(c) {
ef87394c 698 case '?':
ea2384d3
FB
699 case 'h':
700 help();
701 break;
702 case 'f':
703 fmt = optarg;
704 break;
705 case 'O':
706 out_fmt = optarg;
707 break;
f58c7b35
TS
708 case 'B':
709 out_baseimg = optarg;
710 break;
ea2384d3 711 case 'c':
eec77d9e 712 compress = 1;
ea2384d3
FB
713 break;
714 case 'e':
9d42e15d 715 error_report("option -e is deprecated, please use \'-o "
eec77d9e
JS
716 "encryption\' instead!");
717 return 1;
ec36ba14 718 case '6':
9d42e15d 719 error_report("option -6 is deprecated, please use \'-o "
eec77d9e
JS
720 "compat6\' instead!");
721 return 1;
efa84d43
KW
722 case 'o':
723 options = optarg;
724 break;
51ef6727 725 case 's':
726 snapshot_name = optarg;
727 break;
a22f123c
KW
728 case 'S':
729 {
730 int64_t sval;
e36b3695
MA
731 char *end;
732 sval = strtosz_suffix(optarg, &end, STRTOSZ_DEFSUFFIX_B);
733 if (sval < 0 || *end) {
a22f123c
KW
734 error_report("Invalid minimum zero buffer size for sparse output specified");
735 return 1;
736 }
737
738 min_sparse = sval / BDRV_SECTOR_SIZE;
739 break;
740 }
6b837bc4
JS
741 case 'p':
742 progress = 1;
743 break;
661a0f71
FS
744 case 't':
745 cache = optarg;
746 break;
ea2384d3
FB
747 }
748 }
3b46e624 749
926c2d23 750 bs_n = argc - optind - 1;
b8fb60da
JS
751 if (bs_n < 1) {
752 help();
753 }
926c2d23
AZ
754
755 out_filename = argv[argc - 1];
f58c7b35 756
fa170c14
CA
757 /* Initialize before goto out */
758 qemu_progress_init(progress, 2.0);
759
c8057f95 760 if (options && is_help_option(options)) {
4ac8aacd
JS
761 ret = print_block_option_help(out_filename, out_fmt);
762 goto out;
763 }
764
c2abccec 765 if (bs_n > 1 && out_baseimg) {
15654a6d
JS
766 error_report("-B makes no sense when concatenating multiple input "
767 "images");
31ca34b8
JS
768 ret = -1;
769 goto out;
c2abccec 770 }
f8111c24 771
6b837bc4
JS
772 qemu_progress_print(0, 100);
773
7267c094 774 bs = g_malloc0(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
775
776 total_sectors = 0;
777 for (bs_i = 0; bs_i < bs_n; bs_i++) {
f0536bb8 778 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true);
c2abccec 779 if (!bs[bs_i]) {
15654a6d 780 error_report("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
781 ret = -1;
782 goto out;
783 }
926c2d23
AZ
784 bdrv_get_geometry(bs[bs_i], &bs_sectors);
785 total_sectors += bs_sectors;
786 }
ea2384d3 787
51ef6727 788 if (snapshot_name != NULL) {
789 if (bs_n > 1) {
6daf194d 790 error_report("No support for concatenating multiple snapshot");
51ef6727 791 ret = -1;
792 goto out;
793 }
794 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
6daf194d 795 error_report("Failed to load snapshot");
51ef6727 796 ret = -1;
797 goto out;
798 }
799 }
800
efa84d43 801 /* Find driver and parse its options */
ea2384d3 802 drv = bdrv_find_format(out_fmt);
c2abccec 803 if (!drv) {
15654a6d 804 error_report("Unknown file format '%s'", out_fmt);
c2abccec
MK
805 ret = -1;
806 goto out;
807 }
efa84d43 808
b50cbabc 809 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 810 if (!proto_drv) {
15654a6d 811 error_report("Unknown protocol '%s'", out_filename);
c2abccec
MK
812 ret = -1;
813 goto out;
814 }
b50cbabc
MK
815
816 create_options = append_option_parameters(create_options,
817 drv->create_options);
818 create_options = append_option_parameters(create_options,
819 proto_drv->create_options);
db08adf5 820
efa84d43 821 if (options) {
b50cbabc 822 param = parse_option_parameters(options, create_options, param);
efa84d43 823 if (param == NULL) {
15654a6d 824 error_report("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
825 ret = -1;
826 goto out;
efa84d43
KW
827 }
828 } else {
b50cbabc 829 param = parse_option_parameters("", create_options, param);
efa84d43
KW
830 }
831
832 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 833 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
834 if (ret < 0) {
835 goto out;
836 }
efa84d43 837
a18953fb
KW
838 /* Get backing file name if -o backing_file was used */
839 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
840 if (out_baseimg_param) {
841 out_baseimg = out_baseimg_param->value.s;
842 }
843
efa84d43 844 /* Check if compression is supported */
eec77d9e 845 if (compress) {
efa84d43
KW
846 QEMUOptionParameter *encryption =
847 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
41521fa4
KW
848 QEMUOptionParameter *preallocation =
849 get_option_parameter(param, BLOCK_OPT_PREALLOC);
efa84d43
KW
850
851 if (!drv->bdrv_write_compressed) {
15654a6d 852 error_report("Compression not supported for this file format");
c2abccec
MK
853 ret = -1;
854 goto out;
efa84d43
KW
855 }
856
857 if (encryption && encryption->value.n) {
15654a6d
JS
858 error_report("Compression and encryption not supported at "
859 "the same time");
c2abccec
MK
860 ret = -1;
861 goto out;
efa84d43 862 }
41521fa4
KW
863
864 if (preallocation && preallocation->value.s
865 && strcmp(preallocation->value.s, "off"))
866 {
867 error_report("Compression and preallocation not supported at "
868 "the same time");
869 ret = -1;
870 goto out;
871 }
efa84d43
KW
872 }
873
874 /* Create the new image */
875 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
876 if (ret < 0) {
877 if (ret == -ENOTSUP) {
15654a6d
JS
878 error_report("Formatting not supported for file format '%s'",
879 out_fmt);
6e9ea0c0 880 } else if (ret == -EFBIG) {
15654a6d
JS
881 error_report("The image size is too large for file format '%s'",
882 out_fmt);
ea2384d3 883 } else {
15654a6d
JS
884 error_report("%s: error while converting %s: %s",
885 out_filename, out_fmt, strerror(-ret));
ea2384d3 886 }
c2abccec 887 goto out;
ea2384d3 888 }
3b46e624 889
661a0f71 890 flags = BDRV_O_RDWR;
c3993cdc 891 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
892 if (ret < 0) {
893 error_report("Invalid cache option: %s", cache);
894 return -1;
895 }
896
f0536bb8 897 out_bs = bdrv_new_open(out_filename, out_fmt, flags, true);
c2abccec
MK
898 if (!out_bs) {
899 ret = -1;
900 goto out;
901 }
ea2384d3 902
926c2d23
AZ
903 bs_i = 0;
904 bs_offset = 0;
905 bdrv_get_geometry(bs[0], &bs_sectors);
bb1c0597 906 buf = qemu_blockalign(out_bs, IO_BUF_SIZE);
926c2d23 907
eec77d9e 908 if (compress) {
c2abccec
MK
909 ret = bdrv_get_info(out_bs, &bdi);
910 if (ret < 0) {
15654a6d 911 error_report("could not get block driver info");
c2abccec
MK
912 goto out;
913 }
faea38e7 914 cluster_size = bdi.cluster_size;
c2abccec 915 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
15654a6d 916 error_report("invalid cluster size");
c2abccec
MK
917 ret = -1;
918 goto out;
919 }
ea2384d3
FB
920 cluster_sectors = cluster_size >> 9;
921 sector_num = 0;
6b837bc4
JS
922
923 nb_sectors = total_sectors;
1f710495
KW
924 if (nb_sectors != 0) {
925 local_progress = (float)100 /
926 (nb_sectors / MIN(nb_sectors, cluster_sectors));
927 }
6b837bc4 928
ea2384d3 929 for(;;) {
926c2d23
AZ
930 int64_t bs_num;
931 int remainder;
932 uint8_t *buf2;
933
ea2384d3
FB
934 nb_sectors = total_sectors - sector_num;
935 if (nb_sectors <= 0)
936 break;
937 if (nb_sectors >= cluster_sectors)
938 n = cluster_sectors;
939 else
940 n = nb_sectors;
926c2d23
AZ
941
942 bs_num = sector_num - bs_offset;
943 assert (bs_num >= 0);
944 remainder = n;
945 buf2 = buf;
946 while (remainder > 0) {
947 int nlow;
948 while (bs_num == bs_sectors) {
949 bs_i++;
950 assert (bs_i < bs_n);
951 bs_offset += bs_sectors;
952 bdrv_get_geometry(bs[bs_i], &bs_sectors);
953 bs_num = 0;
0bfcd599
BS
954 /* printf("changing part: sector_num=%" PRId64 ", "
955 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
956 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
957 }
958 assert (bs_num < bs_sectors);
959
960 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
961
c2abccec
MK
962 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
963 if (ret < 0) {
3fba9d81
SH
964 error_report("error while reading sector %" PRId64 ": %s",
965 bs_num, strerror(-ret));
c2abccec
MK
966 goto out;
967 }
926c2d23
AZ
968
969 buf2 += nlow * 512;
970 bs_num += nlow;
971
972 remainder -= nlow;
973 }
974 assert (remainder == 0);
975
b8fb60da 976 if (n < cluster_sectors) {
ea2384d3 977 memset(buf + n * 512, 0, cluster_size - n * 512);
b8fb60da 978 }
1a6d39fd 979 if (!buffer_is_zero(buf, cluster_size)) {
c2abccec
MK
980 ret = bdrv_write_compressed(out_bs, sector_num, buf,
981 cluster_sectors);
982 if (ret != 0) {
3fba9d81
SH
983 error_report("error while compressing sector %" PRId64
984 ": %s", sector_num, strerror(-ret));
c2abccec
MK
985 goto out;
986 }
ea2384d3
FB
987 }
988 sector_num += n;
6b837bc4 989 qemu_progress_print(local_progress, 100);
ea2384d3 990 }
faea38e7
FB
991 /* signal EOF to align */
992 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 993 } else {
f2feebbd
KW
994 int has_zero_init = bdrv_has_zero_init(out_bs);
995
f58c7b35 996 sector_num = 0; // total number of sectors converted so far
6b837bc4 997 nb_sectors = total_sectors - sector_num;
1f710495
KW
998 if (nb_sectors != 0) {
999 local_progress = (float)100 /
1000 (nb_sectors / MIN(nb_sectors, IO_BUF_SIZE / 512));
1001 }
6b837bc4 1002
ea2384d3
FB
1003 for(;;) {
1004 nb_sectors = total_sectors - sector_num;
b8fb60da 1005 if (nb_sectors <= 0) {
ea2384d3 1006 break;
b8fb60da
JS
1007 }
1008 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 1009 n = (IO_BUF_SIZE / 512);
b8fb60da 1010 } else {
ea2384d3 1011 n = nb_sectors;
b8fb60da 1012 }
926c2d23
AZ
1013
1014 while (sector_num - bs_offset >= bs_sectors) {
1015 bs_i ++;
1016 assert (bs_i < bs_n);
1017 bs_offset += bs_sectors;
1018 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
1019 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
1020 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
1021 sector_num, bs_i, bs_offset, bs_sectors); */
1022 }
1023
b8fb60da 1024 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 1025 n = bs_offset + bs_sectors - sector_num;
b8fb60da 1026 }
926c2d23 1027
f2feebbd 1028 if (has_zero_init) {
d032044f
AS
1029 /* If the output image is being created as a copy on write image,
1030 assume that sectors which are unallocated in the input image
1031 are present in both the output's and input's base images (no
1032 need to copy them). */
1033 if (out_baseimg) {
1034 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
1035 n, &n1)) {
1036 sector_num += n1;
1037 continue;
1038 }
1039 /* The next 'n1' sectors are allocated in the input image. Copy
1040 only those as they may be followed by unallocated sectors. */
1041 n = n1;
93c65b47 1042 }
93c65b47
AL
1043 } else {
1044 n1 = n;
f58c7b35
TS
1045 }
1046
c2abccec
MK
1047 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
1048 if (ret < 0) {
3fba9d81
SH
1049 error_report("error while reading sector %" PRId64 ": %s",
1050 sector_num - bs_offset, strerror(-ret));
c2abccec
MK
1051 goto out;
1052 }
ea2384d3
FB
1053 /* NOTE: at the same time we convert, we do not write zero
1054 sectors to have a chance to compress the image. Ideally, we
1055 should add a specific call to have the info to go faster */
1056 buf1 = buf;
1057 while (n > 0) {
f58c7b35
TS
1058 /* If the output image is being created as a copy on write image,
1059 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
1060 because they may differ from the sectors in the base image.
1061
1062 If the output is to a host device, we also write out
1063 sectors that are entirely 0, since whatever data was
1064 already there is garbage, not 0s. */
f2feebbd 1065 if (!has_zero_init || out_baseimg ||
a22f123c 1066 is_allocated_sectors_min(buf1, n, &n1, min_sparse)) {
c2abccec
MK
1067 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1068 if (ret < 0) {
3fba9d81
SH
1069 error_report("error while writing sector %" PRId64
1070 ": %s", sector_num, strerror(-ret));
c2abccec
MK
1071 goto out;
1072 }
ea2384d3
FB
1073 }
1074 sector_num += n1;
1075 n -= n1;
1076 buf1 += n1 * 512;
1077 }
6b837bc4 1078 qemu_progress_print(local_progress, 100);
ea2384d3
FB
1079 }
1080 }
c2abccec 1081out:
6b837bc4 1082 qemu_progress_end();
c2abccec
MK
1083 free_option_parameters(create_options);
1084 free_option_parameters(param);
bb1c0597 1085 qemu_vfree(buf);
c2abccec
MK
1086 if (out_bs) {
1087 bdrv_delete(out_bs);
1088 }
31ca34b8
JS
1089 if (bs) {
1090 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1091 if (bs[bs_i]) {
1092 bdrv_delete(bs[bs_i]);
1093 }
c2abccec 1094 }
7267c094 1095 g_free(bs);
c2abccec 1096 }
c2abccec
MK
1097 if (ret) {
1098 return 1;
1099 }
ea2384d3
FB
1100 return 0;
1101}
1102
57d1a2b6 1103
faea38e7
FB
1104static void dump_snapshots(BlockDriverState *bs)
1105{
1106 QEMUSnapshotInfo *sn_tab, *sn;
1107 int nb_sns, i;
1108 char buf[256];
1109
1110 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1111 if (nb_sns <= 0)
1112 return;
1113 printf("Snapshot list:\n");
1114 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1115 for(i = 0; i < nb_sns; i++) {
1116 sn = &sn_tab[i];
1117 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1118 }
7267c094 1119 g_free(sn_tab);
faea38e7
FB
1120}
1121
9699bf0d
SH
1122static void dump_json_image_info_list(ImageInfoList *list)
1123{
1124 Error *errp = NULL;
1125 QString *str;
1126 QmpOutputVisitor *ov = qmp_output_visitor_new();
1127 QObject *obj;
1128 visit_type_ImageInfoList(qmp_output_get_visitor(ov),
1129 &list, NULL, &errp);
1130 obj = qmp_output_get_qobject(ov);
1131 str = qobject_to_json_pretty(obj);
1132 assert(str != NULL);
1133 printf("%s\n", qstring_get_str(str));
1134 qobject_decref(obj);
1135 qmp_output_visitor_cleanup(ov);
1136 QDECREF(str);
1137}
1138
c054b3fd
BC
1139static void collect_snapshots(BlockDriverState *bs , ImageInfo *info)
1140{
1141 int i, sn_count;
1142 QEMUSnapshotInfo *sn_tab = NULL;
1143 SnapshotInfoList *info_list, *cur_item = NULL;
1144 sn_count = bdrv_snapshot_list(bs, &sn_tab);
1145
1146 for (i = 0; i < sn_count; i++) {
1147 info->has_snapshots = true;
1148 info_list = g_new0(SnapshotInfoList, 1);
1149
1150 info_list->value = g_new0(SnapshotInfo, 1);
1151 info_list->value->id = g_strdup(sn_tab[i].id_str);
1152 info_list->value->name = g_strdup(sn_tab[i].name);
1153 info_list->value->vm_state_size = sn_tab[i].vm_state_size;
1154 info_list->value->date_sec = sn_tab[i].date_sec;
1155 info_list->value->date_nsec = sn_tab[i].date_nsec;
1156 info_list->value->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
1157 info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
1158
1159 /* XXX: waiting for the qapi to support qemu-queue.h types */
1160 if (!cur_item) {
1161 info->snapshots = cur_item = info_list;
1162 } else {
1163 cur_item->next = info_list;
1164 cur_item = info_list;
1165 }
1166
1167 }
1168
1169 g_free(sn_tab);
1170}
1171
1172static void dump_json_image_info(ImageInfo *info)
1173{
1174 Error *errp = NULL;
1175 QString *str;
1176 QmpOutputVisitor *ov = qmp_output_visitor_new();
1177 QObject *obj;
1178 visit_type_ImageInfo(qmp_output_get_visitor(ov),
1179 &info, NULL, &errp);
1180 obj = qmp_output_get_qobject(ov);
1181 str = qobject_to_json_pretty(obj);
1182 assert(str != NULL);
1183 printf("%s\n", qstring_get_str(str));
1184 qobject_decref(obj);
1185 qmp_output_visitor_cleanup(ov);
1186 QDECREF(str);
1187}
1188
1189static void collect_image_info(BlockDriverState *bs,
1190 ImageInfo *info,
1191 const char *filename,
1192 const char *fmt)
ea2384d3 1193{
96b8f136 1194 uint64_t total_sectors;
93b6b2a3
FB
1195 char backing_filename[1024];
1196 char backing_filename2[1024];
faea38e7 1197 BlockDriverInfo bdi;
ea2384d3 1198
c054b3fd
BC
1199 bdrv_get_geometry(bs, &total_sectors);
1200
1201 info->filename = g_strdup(filename);
1202 info->format = g_strdup(bdrv_get_format_name(bs));
1203 info->virtual_size = total_sectors * 512;
1204 info->actual_size = bdrv_get_allocated_file_size(bs);
1205 info->has_actual_size = info->actual_size >= 0;
1206 if (bdrv_is_encrypted(bs)) {
1207 info->encrypted = true;
1208 info->has_encrypted = true;
1209 }
1210 if (bdrv_get_info(bs, &bdi) >= 0) {
1211 if (bdi.cluster_size != 0) {
1212 info->cluster_size = bdi.cluster_size;
1213 info->has_cluster_size = true;
1214 }
1215 info->dirty_flag = bdi.is_dirty;
1216 info->has_dirty_flag = true;
1217 }
1218 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1219 if (backing_filename[0] != '\0') {
1220 info->backing_filename = g_strdup(backing_filename);
1221 info->has_backing_filename = true;
1222 bdrv_get_full_backing_filename(bs, backing_filename2,
1223 sizeof(backing_filename2));
1224
1225 if (strcmp(backing_filename, backing_filename2) != 0) {
1226 info->full_backing_filename =
1227 g_strdup(backing_filename2);
1228 info->has_full_backing_filename = true;
1229 }
1230
1231 if (bs->backing_format[0]) {
1232 info->backing_filename_format = g_strdup(bs->backing_format);
1233 info->has_backing_filename_format = true;
1234 }
1235 }
1236}
1237
1238static void dump_human_image_info(ImageInfo *info)
1239{
1240 char size_buf[128], dsize_buf[128];
1241 if (!info->has_actual_size) {
1242 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1243 } else {
1244 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1245 info->actual_size);
1246 }
1247 get_human_readable_size(size_buf, sizeof(size_buf), info->virtual_size);
1248 printf("image: %s\n"
1249 "file format: %s\n"
1250 "virtual size: %s (%" PRId64 " bytes)\n"
1251 "disk size: %s\n",
1252 info->filename, info->format, size_buf,
1253 info->virtual_size,
1254 dsize_buf);
1255
1256 if (info->has_encrypted && info->encrypted) {
1257 printf("encrypted: yes\n");
1258 }
1259
1260 if (info->has_cluster_size) {
1261 printf("cluster_size: %" PRId64 "\n", info->cluster_size);
1262 }
1263
1264 if (info->has_dirty_flag && info->dirty_flag) {
1265 printf("cleanly shut down: no\n");
1266 }
1267
1268 if (info->has_backing_filename) {
1269 printf("backing file: %s", info->backing_filename);
1270 if (info->has_full_backing_filename) {
1271 printf(" (actual path: %s)", info->full_backing_filename);
1272 }
1273 putchar('\n');
1274 if (info->has_backing_filename_format) {
1275 printf("backing file format: %s\n", info->backing_filename_format);
1276 }
1277 }
9699bf0d
SH
1278
1279 if (info->has_snapshots) {
1280 SnapshotInfoList *elem;
1281 char buf[256];
1282
1283 printf("Snapshot list:\n");
1284 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1285
1286 /* Ideally bdrv_snapshot_dump() would operate on SnapshotInfoList but
1287 * we convert to the block layer's native QEMUSnapshotInfo for now.
1288 */
1289 for (elem = info->snapshots; elem; elem = elem->next) {
1290 QEMUSnapshotInfo sn = {
1291 .vm_state_size = elem->value->vm_state_size,
1292 .date_sec = elem->value->date_sec,
1293 .date_nsec = elem->value->date_nsec,
1294 .vm_clock_nsec = elem->value->vm_clock_sec * 1000000000ULL +
1295 elem->value->vm_clock_nsec,
1296 };
1297
1298 pstrcpy(sn.id_str, sizeof(sn.id_str), elem->value->id);
1299 pstrcpy(sn.name, sizeof(sn.name), elem->value->name);
1300 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), &sn));
1301 }
1302 }
c054b3fd
BC
1303}
1304
9699bf0d
SH
1305static void dump_human_image_info_list(ImageInfoList *list)
1306{
1307 ImageInfoList *elem;
1308 bool delim = false;
1309
1310 for (elem = list; elem; elem = elem->next) {
1311 if (delim) {
1312 printf("\n");
1313 }
1314 delim = true;
1315
1316 dump_human_image_info(elem->value);
1317 }
1318}
1319
1320static gboolean str_equal_func(gconstpointer a, gconstpointer b)
1321{
1322 return strcmp(a, b) == 0;
1323}
1324
1325/**
1326 * Open an image file chain and return an ImageInfoList
1327 *
1328 * @filename: topmost image filename
1329 * @fmt: topmost image format (may be NULL to autodetect)
1330 * @chain: true - enumerate entire backing file chain
1331 * false - only topmost image file
1332 *
1333 * Returns a list of ImageInfo objects or NULL if there was an error opening an
1334 * image file. If there was an error a message will have been printed to
1335 * stderr.
1336 */
1337static ImageInfoList *collect_image_info_list(const char *filename,
1338 const char *fmt,
1339 bool chain)
1340{
1341 ImageInfoList *head = NULL;
1342 ImageInfoList **last = &head;
1343 GHashTable *filenames;
1344
1345 filenames = g_hash_table_new_full(g_str_hash, str_equal_func, NULL, NULL);
1346
1347 while (filename) {
1348 BlockDriverState *bs;
1349 ImageInfo *info;
1350 ImageInfoList *elem;
1351
1352 if (g_hash_table_lookup_extended(filenames, filename, NULL, NULL)) {
1353 error_report("Backing file '%s' creates an infinite loop.",
1354 filename);
1355 goto err;
1356 }
1357 g_hash_table_insert(filenames, (gpointer)filename, NULL);
1358
1359 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING,
1360 false);
1361 if (!bs) {
1362 goto err;
1363 }
1364
1365 info = g_new0(ImageInfo, 1);
1366 collect_image_info(bs, info, filename, fmt);
1367 collect_snapshots(bs, info);
1368
1369 elem = g_new0(ImageInfoList, 1);
1370 elem->value = info;
1371 *last = elem;
1372 last = &elem->next;
1373
1374 bdrv_delete(bs);
1375
1376 filename = fmt = NULL;
1377 if (chain) {
1378 if (info->has_full_backing_filename) {
1379 filename = info->full_backing_filename;
1380 } else if (info->has_backing_filename) {
1381 filename = info->backing_filename;
1382 }
1383 if (info->has_backing_filename_format) {
1384 fmt = info->backing_filename_format;
1385 }
1386 }
1387 }
1388 g_hash_table_destroy(filenames);
1389 return head;
1390
1391err:
1392 qapi_free_ImageInfoList(head);
1393 g_hash_table_destroy(filenames);
1394 return NULL;
1395}
1396
1397enum {
1398 OPTION_OUTPUT = 256,
1399 OPTION_BACKING_CHAIN = 257,
1400};
c054b3fd
BC
1401
1402typedef enum OutputFormat {
1403 OFORMAT_JSON,
1404 OFORMAT_HUMAN,
1405} OutputFormat;
1406
1407static int img_info(int argc, char **argv)
1408{
1409 int c;
1410 OutputFormat output_format = OFORMAT_HUMAN;
9699bf0d 1411 bool chain = false;
c054b3fd 1412 const char *filename, *fmt, *output;
9699bf0d 1413 ImageInfoList *list;
c054b3fd 1414
ea2384d3 1415 fmt = NULL;
c054b3fd 1416 output = NULL;
ea2384d3 1417 for(;;) {
c054b3fd
BC
1418 int option_index = 0;
1419 static const struct option long_options[] = {
1420 {"help", no_argument, 0, 'h'},
1421 {"format", required_argument, 0, 'f'},
1422 {"output", required_argument, 0, OPTION_OUTPUT},
9699bf0d 1423 {"backing-chain", no_argument, 0, OPTION_BACKING_CHAIN},
c054b3fd
BC
1424 {0, 0, 0, 0}
1425 };
1426 c = getopt_long(argc, argv, "f:h",
1427 long_options, &option_index);
b8fb60da 1428 if (c == -1) {
ea2384d3 1429 break;
b8fb60da 1430 }
ea2384d3 1431 switch(c) {
ef87394c 1432 case '?':
ea2384d3
FB
1433 case 'h':
1434 help();
1435 break;
1436 case 'f':
1437 fmt = optarg;
1438 break;
c054b3fd
BC
1439 case OPTION_OUTPUT:
1440 output = optarg;
1441 break;
9699bf0d
SH
1442 case OPTION_BACKING_CHAIN:
1443 chain = true;
1444 break;
ea2384d3
FB
1445 }
1446 }
b8fb60da 1447 if (optind >= argc) {
ea2384d3 1448 help();
b8fb60da 1449 }
ea2384d3
FB
1450 filename = argv[optind++];
1451
c054b3fd
BC
1452 if (output && !strcmp(output, "json")) {
1453 output_format = OFORMAT_JSON;
1454 } else if (output && !strcmp(output, "human")) {
1455 output_format = OFORMAT_HUMAN;
1456 } else if (output) {
1457 error_report("--output must be used with human or json as argument.");
c2abccec
MK
1458 return 1;
1459 }
c054b3fd 1460
9699bf0d
SH
1461 list = collect_image_info_list(filename, fmt, chain);
1462 if (!list) {
c2abccec 1463 return 1;
faea38e7 1464 }
c054b3fd 1465
c054b3fd
BC
1466 switch (output_format) {
1467 case OFORMAT_HUMAN:
9699bf0d 1468 dump_human_image_info_list(list);
c054b3fd
BC
1469 break;
1470 case OFORMAT_JSON:
9699bf0d
SH
1471 if (chain) {
1472 dump_json_image_info_list(list);
1473 } else {
1474 dump_json_image_info(list->value);
1475 }
c054b3fd 1476 break;
faea38e7 1477 }
c054b3fd 1478
9699bf0d 1479 qapi_free_ImageInfoList(list);
ea2384d3
FB
1480 return 0;
1481}
1482
f7b4a940
AL
1483#define SNAPSHOT_LIST 1
1484#define SNAPSHOT_CREATE 2
1485#define SNAPSHOT_APPLY 3
1486#define SNAPSHOT_DELETE 4
1487
153859be 1488static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1489{
1490 BlockDriverState *bs;
1491 QEMUSnapshotInfo sn;
1492 char *filename, *snapshot_name = NULL;
c2abccec 1493 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
1494 int action = 0;
1495 qemu_timeval tv;
1496
710da702 1497 bdrv_oflags = BDRV_O_FLAGS | BDRV_O_RDWR;
f7b4a940
AL
1498 /* Parse commandline parameters */
1499 for(;;) {
1500 c = getopt(argc, argv, "la:c:d:h");
b8fb60da 1501 if (c == -1) {
f7b4a940 1502 break;
b8fb60da 1503 }
f7b4a940 1504 switch(c) {
ef87394c 1505 case '?':
f7b4a940
AL
1506 case 'h':
1507 help();
153859be 1508 return 0;
f7b4a940
AL
1509 case 'l':
1510 if (action) {
1511 help();
153859be 1512 return 0;
f7b4a940
AL
1513 }
1514 action = SNAPSHOT_LIST;
f5edb014 1515 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
1516 break;
1517 case 'a':
1518 if (action) {
1519 help();
153859be 1520 return 0;
f7b4a940
AL
1521 }
1522 action = SNAPSHOT_APPLY;
1523 snapshot_name = optarg;
1524 break;
1525 case 'c':
1526 if (action) {
1527 help();
153859be 1528 return 0;
f7b4a940
AL
1529 }
1530 action = SNAPSHOT_CREATE;
1531 snapshot_name = optarg;
1532 break;
1533 case 'd':
1534 if (action) {
1535 help();
153859be 1536 return 0;
f7b4a940
AL
1537 }
1538 action = SNAPSHOT_DELETE;
1539 snapshot_name = optarg;
1540 break;
1541 }
1542 }
1543
b8fb60da 1544 if (optind >= argc) {
f7b4a940 1545 help();
b8fb60da 1546 }
f7b4a940
AL
1547 filename = argv[optind++];
1548
1549 /* Open the image */
f0536bb8 1550 bs = bdrv_new_open(filename, NULL, bdrv_oflags, true);
c2abccec
MK
1551 if (!bs) {
1552 return 1;
1553 }
f7b4a940
AL
1554
1555 /* Perform the requested action */
1556 switch(action) {
1557 case SNAPSHOT_LIST:
1558 dump_snapshots(bs);
1559 break;
1560
1561 case SNAPSHOT_CREATE:
1562 memset(&sn, 0, sizeof(sn));
1563 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1564
1565 qemu_gettimeofday(&tv);
1566 sn.date_sec = tv.tv_sec;
1567 sn.date_nsec = tv.tv_usec * 1000;
1568
1569 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 1570 if (ret) {
15654a6d 1571 error_report("Could not create snapshot '%s': %d (%s)",
f7b4a940 1572 snapshot_name, ret, strerror(-ret));
b8fb60da 1573 }
f7b4a940
AL
1574 break;
1575
1576 case SNAPSHOT_APPLY:
1577 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 1578 if (ret) {
15654a6d 1579 error_report("Could not apply snapshot '%s': %d (%s)",
f7b4a940 1580 snapshot_name, ret, strerror(-ret));
b8fb60da 1581 }
f7b4a940
AL
1582 break;
1583
1584 case SNAPSHOT_DELETE:
1585 ret = bdrv_snapshot_delete(bs, snapshot_name);
b8fb60da 1586 if (ret) {
15654a6d 1587 error_report("Could not delete snapshot '%s': %d (%s)",
f7b4a940 1588 snapshot_name, ret, strerror(-ret));
b8fb60da 1589 }
f7b4a940
AL
1590 break;
1591 }
1592
1593 /* Cleanup */
1594 bdrv_delete(bs);
c2abccec
MK
1595 if (ret) {
1596 return 1;
1597 }
153859be 1598 return 0;
f7b4a940
AL
1599}
1600
3e85c6fd
KW
1601static int img_rebase(int argc, char **argv)
1602{
c2abccec 1603 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 1604 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 1605 char *filename;
661a0f71 1606 const char *fmt, *cache, *out_basefmt, *out_baseimg;
3e85c6fd
KW
1607 int c, flags, ret;
1608 int unsafe = 0;
6b837bc4 1609 int progress = 0;
3e85c6fd
KW
1610
1611 /* Parse commandline parameters */
e53dbee0 1612 fmt = NULL;
661a0f71 1613 cache = BDRV_DEFAULT_CACHE;
3e85c6fd
KW
1614 out_baseimg = NULL;
1615 out_basefmt = NULL;
3e85c6fd 1616 for(;;) {
661a0f71 1617 c = getopt(argc, argv, "uhf:F:b:pt:");
b8fb60da 1618 if (c == -1) {
3e85c6fd 1619 break;
b8fb60da 1620 }
3e85c6fd 1621 switch(c) {
ef87394c 1622 case '?':
3e85c6fd
KW
1623 case 'h':
1624 help();
1625 return 0;
e53dbee0
KW
1626 case 'f':
1627 fmt = optarg;
1628 break;
3e85c6fd
KW
1629 case 'F':
1630 out_basefmt = optarg;
1631 break;
1632 case 'b':
1633 out_baseimg = optarg;
1634 break;
1635 case 'u':
1636 unsafe = 1;
1637 break;
6b837bc4
JS
1638 case 'p':
1639 progress = 1;
1640 break;
661a0f71
FS
1641 case 't':
1642 cache = optarg;
1643 break;
3e85c6fd
KW
1644 }
1645 }
1646
9a9d9dba 1647 if ((optind >= argc) || (!unsafe && !out_baseimg)) {
3e85c6fd 1648 help();
b8fb60da 1649 }
3e85c6fd
KW
1650 filename = argv[optind++];
1651
6b837bc4
JS
1652 qemu_progress_init(progress, 2.0);
1653 qemu_progress_print(0, 100);
1654
661a0f71 1655 flags = BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
c3993cdc 1656 ret = bdrv_parse_cache_flags(cache, &flags);
661a0f71
FS
1657 if (ret < 0) {
1658 error_report("Invalid cache option: %s", cache);
1659 return -1;
1660 }
1661
3e85c6fd
KW
1662 /*
1663 * Open the images.
1664 *
1665 * Ignore the old backing file for unsafe rebase in case we want to correct
1666 * the reference to a renamed or moved backing file.
1667 */
f0536bb8 1668 bs = bdrv_new_open(filename, fmt, flags, true);
c2abccec
MK
1669 if (!bs) {
1670 return 1;
1671 }
3e85c6fd
KW
1672
1673 /* Find the right drivers for the backing files */
1674 old_backing_drv = NULL;
1675 new_backing_drv = NULL;
1676
1677 if (!unsafe && bs->backing_format[0] != '\0') {
1678 old_backing_drv = bdrv_find_format(bs->backing_format);
1679 if (old_backing_drv == NULL) {
15654a6d 1680 error_report("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
1681 ret = -1;
1682 goto out;
3e85c6fd
KW
1683 }
1684 }
1685
1686 if (out_basefmt != NULL) {
1687 new_backing_drv = bdrv_find_format(out_basefmt);
1688 if (new_backing_drv == NULL) {
15654a6d 1689 error_report("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
1690 ret = -1;
1691 goto out;
3e85c6fd
KW
1692 }
1693 }
1694
1695 /* For safe rebasing we need to compare old and new backing file */
1696 if (unsafe) {
1697 /* Make the compiler happy */
1698 bs_old_backing = NULL;
1699 bs_new_backing = NULL;
1700 } else {
1701 char backing_name[1024];
1702
1703 bs_old_backing = bdrv_new("old_backing");
1704 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
c2abccec
MK
1705 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1706 old_backing_drv);
1707 if (ret) {
15654a6d 1708 error_report("Could not open old backing file '%s'", backing_name);
c2abccec 1709 goto out;
3e85c6fd 1710 }
a616673d
AB
1711 if (out_baseimg[0]) {
1712 bs_new_backing = bdrv_new("new_backing");
1713 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
c2abccec 1714 new_backing_drv);
a616673d
AB
1715 if (ret) {
1716 error_report("Could not open new backing file '%s'",
1717 out_baseimg);
1718 goto out;
1719 }
3e85c6fd
KW
1720 }
1721 }
1722
1723 /*
1724 * Check each unallocated cluster in the COW file. If it is unallocated,
1725 * accesses go to the backing file. We must therefore compare this cluster
1726 * in the old and new backing file, and if they differ we need to copy it
1727 * from the old backing file into the COW file.
1728 *
1729 * If qemu-img crashes during this step, no harm is done. The content of
1730 * the image is the same as the original one at any time.
1731 */
1732 if (!unsafe) {
1733 uint64_t num_sectors;
87a1b3e3 1734 uint64_t old_backing_num_sectors;
a616673d 1735 uint64_t new_backing_num_sectors = 0;
3e85c6fd 1736 uint64_t sector;
cc60e327 1737 int n;
d6771bfa
T
1738 uint8_t * buf_old;
1739 uint8_t * buf_new;
1f710495 1740 float local_progress = 0;
d6771bfa 1741
bb1c0597
KW
1742 buf_old = qemu_blockalign(bs, IO_BUF_SIZE);
1743 buf_new = qemu_blockalign(bs, IO_BUF_SIZE);
3e85c6fd
KW
1744
1745 bdrv_get_geometry(bs, &num_sectors);
87a1b3e3 1746 bdrv_get_geometry(bs_old_backing, &old_backing_num_sectors);
a616673d
AB
1747 if (bs_new_backing) {
1748 bdrv_get_geometry(bs_new_backing, &new_backing_num_sectors);
1749 }
3e85c6fd 1750
1f710495
KW
1751 if (num_sectors != 0) {
1752 local_progress = (float)100 /
1753 (num_sectors / MIN(num_sectors, IO_BUF_SIZE / 512));
1754 }
1755
3e85c6fd
KW
1756 for (sector = 0; sector < num_sectors; sector += n) {
1757
1758 /* How many sectors can we handle with the next read? */
1759 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1760 n = (IO_BUF_SIZE / 512);
1761 } else {
1762 n = num_sectors - sector;
1763 }
1764
1765 /* If the cluster is allocated, we don't need to take action */
cc60e327
KW
1766 ret = bdrv_is_allocated(bs, sector, n, &n);
1767 if (ret) {
3e85c6fd
KW
1768 continue;
1769 }
1770
87a1b3e3
KW
1771 /*
1772 * Read old and new backing file and take into consideration that
1773 * backing files may be smaller than the COW image.
1774 */
1775 if (sector >= old_backing_num_sectors) {
1776 memset(buf_old, 0, n * BDRV_SECTOR_SIZE);
1777 } else {
1778 if (sector + n > old_backing_num_sectors) {
1779 n = old_backing_num_sectors - sector;
1780 }
1781
1782 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1783 if (ret < 0) {
1784 error_report("error while reading from old backing file");
1785 goto out;
1786 }
3e85c6fd 1787 }
87a1b3e3 1788
a616673d 1789 if (sector >= new_backing_num_sectors || !bs_new_backing) {
87a1b3e3
KW
1790 memset(buf_new, 0, n * BDRV_SECTOR_SIZE);
1791 } else {
1792 if (sector + n > new_backing_num_sectors) {
1793 n = new_backing_num_sectors - sector;
1794 }
1795
1796 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1797 if (ret < 0) {
1798 error_report("error while reading from new backing file");
1799 goto out;
1800 }
3e85c6fd
KW
1801 }
1802
1803 /* If they differ, we need to write to the COW file */
1804 uint64_t written = 0;
1805
1806 while (written < n) {
1807 int pnum;
1808
1809 if (compare_sectors(buf_old + written * 512,
60b1bd4f 1810 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
1811 {
1812 ret = bdrv_write(bs, sector + written,
1813 buf_old + written * 512, pnum);
1814 if (ret < 0) {
15654a6d 1815 error_report("Error while writing to COW image: %s",
3e85c6fd 1816 strerror(-ret));
c2abccec 1817 goto out;
3e85c6fd
KW
1818 }
1819 }
1820
1821 written += pnum;
1822 }
6b837bc4 1823 qemu_progress_print(local_progress, 100);
3e85c6fd 1824 }
d6771bfa 1825
bb1c0597
KW
1826 qemu_vfree(buf_old);
1827 qemu_vfree(buf_new);
3e85c6fd
KW
1828 }
1829
1830 /*
1831 * Change the backing file. All clusters that are different from the old
1832 * backing file are overwritten in the COW file now, so the visible content
1833 * doesn't change when we switch the backing file.
1834 */
a616673d
AB
1835 if (out_baseimg && *out_baseimg) {
1836 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1837 } else {
1838 ret = bdrv_change_backing_file(bs, NULL, NULL);
1839 }
1840
3e85c6fd 1841 if (ret == -ENOSPC) {
15654a6d
JS
1842 error_report("Could not change the backing file to '%s': No "
1843 "space left in the file header", out_baseimg);
3e85c6fd 1844 } else if (ret < 0) {
15654a6d 1845 error_report("Could not change the backing file to '%s': %s",
3e85c6fd
KW
1846 out_baseimg, strerror(-ret));
1847 }
1848
6b837bc4 1849 qemu_progress_print(100, 0);
3e85c6fd
KW
1850 /*
1851 * TODO At this point it is possible to check if any clusters that are
1852 * allocated in the COW file are the same in the backing file. If so, they
1853 * could be dropped from the COW file. Don't do this before switching the
1854 * backing file, in case of a crash this would lead to corruption.
1855 */
c2abccec 1856out:
6b837bc4 1857 qemu_progress_end();
3e85c6fd
KW
1858 /* Cleanup */
1859 if (!unsafe) {
eb863add
KW
1860 if (bs_old_backing != NULL) {
1861 bdrv_delete(bs_old_backing);
1862 }
1863 if (bs_new_backing != NULL) {
1864 bdrv_delete(bs_new_backing);
1865 }
3e85c6fd
KW
1866 }
1867
1868 bdrv_delete(bs);
c2abccec
MK
1869 if (ret) {
1870 return 1;
1871 }
3e85c6fd
KW
1872 return 0;
1873}
1874
ae6b0ed6
SH
1875static int img_resize(int argc, char **argv)
1876{
1877 int c, ret, relative;
1878 const char *filename, *fmt, *size;
1879 int64_t n, total_size;
2a81998a 1880 BlockDriverState *bs = NULL;
20caf0f7
DXW
1881 QemuOpts *param;
1882 static QemuOptsList resize_options = {
1883 .name = "resize_options",
1884 .head = QTAILQ_HEAD_INITIALIZER(resize_options.head),
1885 .desc = {
1886 {
1887 .name = BLOCK_OPT_SIZE,
1888 .type = QEMU_OPT_SIZE,
1889 .help = "Virtual disk size"
1890 }, {
1891 /* end of list */
1892 }
ae6b0ed6 1893 },
ae6b0ed6
SH
1894 };
1895
e80fec7f
KW
1896 /* Remove size from argv manually so that negative numbers are not treated
1897 * as options by getopt. */
1898 if (argc < 3) {
1899 help();
1900 return 1;
1901 }
1902
1903 size = argv[--argc];
1904
1905 /* Parse getopt arguments */
ae6b0ed6
SH
1906 fmt = NULL;
1907 for(;;) {
1908 c = getopt(argc, argv, "f:h");
1909 if (c == -1) {
1910 break;
1911 }
1912 switch(c) {
ef87394c 1913 case '?':
ae6b0ed6
SH
1914 case 'h':
1915 help();
1916 break;
1917 case 'f':
1918 fmt = optarg;
1919 break;
1920 }
1921 }
e80fec7f 1922 if (optind >= argc) {
ae6b0ed6
SH
1923 help();
1924 }
1925 filename = argv[optind++];
ae6b0ed6
SH
1926
1927 /* Choose grow, shrink, or absolute resize mode */
1928 switch (size[0]) {
1929 case '+':
1930 relative = 1;
1931 size++;
1932 break;
1933 case '-':
1934 relative = -1;
1935 size++;
1936 break;
1937 default:
1938 relative = 0;
1939 break;
1940 }
1941
1942 /* Parse size */
20caf0f7
DXW
1943 param = qemu_opts_create(&resize_options, NULL, 0, NULL);
1944 if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
ae6b0ed6 1945 /* Error message already printed when size parsing fails */
2a81998a 1946 ret = -1;
20caf0f7 1947 qemu_opts_del(param);
2a81998a 1948 goto out;
ae6b0ed6 1949 }
20caf0f7
DXW
1950 n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0);
1951 qemu_opts_del(param);
ae6b0ed6 1952
f0536bb8 1953 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true);
c2abccec 1954 if (!bs) {
2a81998a
JS
1955 ret = -1;
1956 goto out;
c2abccec 1957 }
ae6b0ed6
SH
1958
1959 if (relative) {
1960 total_size = bdrv_getlength(bs) + n * relative;
1961 } else {
1962 total_size = n;
1963 }
1964 if (total_size <= 0) {
15654a6d 1965 error_report("New image size must be positive");
c2abccec
MK
1966 ret = -1;
1967 goto out;
ae6b0ed6
SH
1968 }
1969
1970 ret = bdrv_truncate(bs, total_size);
1971 switch (ret) {
1972 case 0:
1973 printf("Image resized.\n");
1974 break;
1975 case -ENOTSUP:
259b2173 1976 error_report("This image does not support resize");
ae6b0ed6
SH
1977 break;
1978 case -EACCES:
15654a6d 1979 error_report("Image is read-only");
ae6b0ed6
SH
1980 break;
1981 default:
15654a6d 1982 error_report("Error resizing image (%d)", -ret);
ae6b0ed6
SH
1983 break;
1984 }
c2abccec 1985out:
2a81998a
JS
1986 if (bs) {
1987 bdrv_delete(bs);
1988 }
c2abccec
MK
1989 if (ret) {
1990 return 1;
1991 }
ae6b0ed6
SH
1992 return 0;
1993}
1994
c227f099 1995static const img_cmd_t img_cmds[] = {
153859be
SB
1996#define DEF(option, callback, arg_string) \
1997 { option, callback },
1998#include "qemu-img-cmds.h"
1999#undef DEF
2000#undef GEN_DOCS
2001 { NULL, NULL, },
2002};
2003
ea2384d3
FB
2004int main(int argc, char **argv)
2005{
c227f099 2006 const img_cmd_t *cmd;
153859be 2007 const char *cmdname;
ea2384d3 2008
53f76e58
KW
2009 error_set_progname(argv[0]);
2010
2592c59a 2011 qemu_init_main_loop();
ea2384d3
FB
2012 bdrv_init();
2013 if (argc < 2)
2014 help();
153859be 2015 cmdname = argv[1];
8f9b157e 2016 argc--; argv++;
153859be
SB
2017
2018 /* find the command */
2019 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
2020 if (!strcmp(cmdname, cmd->name)) {
2021 return cmd->handler(argc, argv);
2022 }
ea2384d3 2023 }
153859be
SB
2024
2025 /* not found */
2026 help();
ea2384d3
FB
2027 return 0;
2028}