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