]> git.proxmox.com Git - qemu.git/blame - qemu-img.c
qemu-img: Call error_set_progname
[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 */
faf07963 24#include "qemu-common.h"
9ea2ea71 25#include "qemu-option.h"
53f76e58 26#include "qemu-error.h"
f7b4a940 27#include "osdep.h"
dc786bc9 28#include "sysemu.h"
ec36ba14 29#include "block_int.h"
9230eaf6 30#include <stdio.h>
ea2384d3 31
e8445331
FB
32#ifdef _WIN32
33#include <windows.h>
34#endif
35
c227f099 36typedef struct img_cmd_t {
153859be
SB
37 const char *name;
38 int (*handler)(int argc, char **argv);
c227f099 39} img_cmd_t;
153859be 40
137519ce 41/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
adfe078e 42#define BDRV_O_FLAGS BDRV_O_CACHE_WB
137519ce 43
8b7968f7 44static void GCC_FMT_ATTR(1, 2) error(const char *fmt, ...)
ea2384d3
FB
45{
46 va_list ap;
47 va_start(ap, fmt);
57d1a2b6 48 fprintf(stderr, "qemu-img: ");
ea2384d3
FB
49 vfprintf(stderr, fmt, ap);
50 fprintf(stderr, "\n");
ea2384d3
FB
51 va_end(ap);
52}
53
54static void format_print(void *opaque, const char *name)
55{
56 printf(" %s", name);
57}
58
d2c639d6 59/* Please keep in synch with qemu-img.texi */
3f379ab1 60static void help(void)
ea2384d3 61{
e00291c0
PB
62 const char *help_msg =
63 "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
3f020d70 64 "usage: qemu-img command [command options]\n"
65 "QEMU disk image utility\n"
66 "\n"
67 "Command syntax:\n"
153859be
SB
68#define DEF(option, callback, arg_string) \
69 " " arg_string "\n"
70#include "qemu-img-cmds.h"
71#undef DEF
72#undef GEN_DOCS
3f020d70 73 "\n"
74 "Command parameters:\n"
75 " 'filename' is a disk image filename\n"
76 " 'fmt' is the disk image format. It is guessed automatically in most cases\n"
77 " 'size' is the disk image size in bytes. Optional suffixes\n"
78 " 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
79 " and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
80 " 'output_filename' is the destination disk image filename\n"
81 " 'output_fmt' is the destination format\n"
82 " 'options' is a comma separated list of format specific options in a\n"
83 " name=value format. Use -o ? for an overview of the options supported by the\n"
84 " used format\n"
85 " '-c' indicates that target image must be compressed (qcow format only)\n"
86 " '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
87 " match exactly. The image doesn't need a working backing file before\n"
88 " rebasing in this case (useful for renaming the backing file)\n"
89 " '-h' with or without a command shows this help and lists the supported formats\n"
90 "\n"
91 "Parameters to snapshot subcommand:\n"
92 " 'snapshot' is the name of the snapshot to create, apply or delete\n"
93 " '-a' applies a snapshot (revert disk to saved state)\n"
94 " '-c' creates a snapshot\n"
95 " '-d' deletes a snapshot\n"
e00291c0
PB
96 " '-l' lists all snapshots in the given image\n";
97
98 printf("%s\nSupported formats:", help_msg);
ea2384d3
FB
99 bdrv_iterate_format(format_print, NULL);
100 printf("\n");
101 exit(1);
102}
103
ea2384d3
FB
104#if defined(WIN32)
105/* XXX: put correct support for win32 */
106static int read_password(char *buf, int buf_size)
107{
108 int c, i;
109 printf("Password: ");
110 fflush(stdout);
111 i = 0;
112 for(;;) {
113 c = getchar();
114 if (c == '\n')
115 break;
116 if (i < (buf_size - 1))
117 buf[i++] = c;
118 }
119 buf[i] = '\0';
120 return 0;
121}
122
123#else
124
125#include <termios.h>
126
127static struct termios oldtty;
128
129static void term_exit(void)
130{
131 tcsetattr (0, TCSANOW, &oldtty);
132}
133
134static void term_init(void)
135{
136 struct termios tty;
137
138 tcgetattr (0, &tty);
139 oldtty = tty;
140
141 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
142 |INLCR|IGNCR|ICRNL|IXON);
143 tty.c_oflag |= OPOST;
144 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
145 tty.c_cflag &= ~(CSIZE|PARENB);
146 tty.c_cflag |= CS8;
147 tty.c_cc[VMIN] = 1;
148 tty.c_cc[VTIME] = 0;
3b46e624 149
ea2384d3
FB
150 tcsetattr (0, TCSANOW, &tty);
151
152 atexit(term_exit);
153}
154
3f379ab1 155static int read_password(char *buf, int buf_size)
ea2384d3
FB
156{
157 uint8_t ch;
158 int i, ret;
159
160 printf("password: ");
161 fflush(stdout);
162 term_init();
163 i = 0;
164 for(;;) {
165 ret = read(0, &ch, 1);
166 if (ret == -1) {
167 if (errno == EAGAIN || errno == EINTR) {
168 continue;
169 } else {
170 ret = -1;
171 break;
172 }
173 } else if (ret == 0) {
174 ret = -1;
175 break;
176 } else {
177 if (ch == '\r') {
178 ret = 0;
179 break;
180 }
181 if (i < (buf_size - 1))
182 buf[i++] = ch;
183 }
184 }
185 term_exit();
186 buf[i] = '\0';
187 printf("\n");
188 return ret;
189}
190#endif
191
4ac8aacd
JS
192static int print_block_option_help(const char *filename, const char *fmt)
193{
194 BlockDriver *drv, *proto_drv;
195 QEMUOptionParameter *create_options = NULL;
196
197 /* Find driver and parse its options */
198 drv = bdrv_find_format(fmt);
199 if (!drv) {
200 error("Unknown file format '%s'", fmt);
201 return 1;
202 }
203
204 proto_drv = bdrv_find_protocol(filename);
205 if (!proto_drv) {
206 error("Unknown protocol '%s'", filename);
207 return 1;
208 }
209
210 create_options = append_option_parameters(create_options,
211 drv->create_options);
212 create_options = append_option_parameters(create_options,
213 proto_drv->create_options);
214 print_option_help(create_options);
215 free_option_parameters(create_options);
216 return 0;
217}
218
75c23805 219static BlockDriverState *bdrv_new_open(const char *filename,
9bc378c1 220 const char *fmt,
f163d073 221 int flags)
75c23805
FB
222{
223 BlockDriverState *bs;
224 BlockDriver *drv;
225 char password[256];
226
227 bs = bdrv_new("");
c2abccec 228 if (!bs) {
75c23805 229 error("Not enough memory");
c2abccec
MK
230 goto fail;
231 }
75c23805
FB
232 if (fmt) {
233 drv = bdrv_find_format(fmt);
c2abccec 234 if (!drv) {
75c23805 235 error("Unknown file format '%s'", fmt);
c2abccec
MK
236 goto fail;
237 }
75c23805
FB
238 } else {
239 drv = NULL;
240 }
d6e9098e 241 if (bdrv_open(bs, filename, flags, drv) < 0) {
75c23805 242 error("Could not open '%s'", filename);
c2abccec 243 goto fail;
75c23805
FB
244 }
245 if (bdrv_is_encrypted(bs)) {
246 printf("Disk image '%s' is encrypted.\n", filename);
c2abccec 247 if (read_password(password, sizeof(password)) < 0) {
75c23805 248 error("No password given");
c2abccec
MK
249 goto fail;
250 }
251 if (bdrv_set_key(bs, password) < 0) {
75c23805 252 error("invalid password");
c2abccec
MK
253 goto fail;
254 }
75c23805
FB
255 }
256 return bs;
c2abccec
MK
257fail:
258 if (bs) {
259 bdrv_delete(bs);
260 }
261 return NULL;
75c23805
FB
262}
263
c2abccec 264static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
eec77d9e
JS
265 const char *base_filename,
266 const char *base_fmt)
efa84d43 267{
efa84d43
KW
268 if (base_filename) {
269 if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
270 error("Backing file not supported for file format '%s'", fmt);
c2abccec 271 return -1;
efa84d43
KW
272 }
273 }
274 if (base_fmt) {
275 if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
276 error("Backing file format not supported for file format '%s'", fmt);
c2abccec 277 return -1;
efa84d43
KW
278 }
279 }
c2abccec 280 return 0;
efa84d43
KW
281}
282
ea2384d3
FB
283static int img_create(int argc, char **argv)
284{
eec77d9e 285 int c, ret = 0;
1da7cfbd 286 uint64_t img_size = -1;
ea2384d3 287 const char *fmt = "raw";
9230eaf6 288 const char *base_fmt = NULL;
ea2384d3
FB
289 const char *filename;
290 const char *base_filename = NULL;
b50cbabc
MK
291 BlockDriver *drv, *proto_drv;
292 QEMUOptionParameter *param = NULL, *create_options = NULL;
5eeaad5a 293 QEMUOptionParameter *backing_fmt = NULL;
9ea2ea71 294 char *options = NULL;
3b46e624 295
ea2384d3 296 for(;;) {
9ea2ea71 297 c = getopt(argc, argv, "F:b:f:he6o:");
b8fb60da 298 if (c == -1) {
ea2384d3 299 break;
b8fb60da 300 }
ea2384d3 301 switch(c) {
ef87394c 302 case '?':
ea2384d3
FB
303 case 'h':
304 help();
305 break;
9230eaf6
AL
306 case 'F':
307 base_fmt = optarg;
308 break;
ea2384d3
FB
309 case 'b':
310 base_filename = optarg;
311 break;
312 case 'f':
313 fmt = optarg;
314 break;
315 case 'e':
eec77d9e
JS
316 error("qemu-img: option -e is deprecated, please use \'-o "
317 "encryption\' instead!");
318 return 1;
d8871c5a 319 case '6':
eec77d9e
JS
320 error("qemu-img: option -6 is deprecated, please use \'-o "
321 "compat6\' instead!");
322 return 1;
9ea2ea71
KW
323 case 'o':
324 options = optarg;
325 break;
ea2384d3
FB
326 }
327 }
9230eaf6 328
b50cbabc 329 /* Get the filename */
b8fb60da 330 if (optind >= argc) {
b50cbabc 331 help();
b8fb60da 332 }
b50cbabc
MK
333 filename = argv[optind++];
334
1da7cfbd
JS
335 /* Get image size, if specified */
336 if (optind < argc) {
337 ssize_t sval;
338 sval = strtosz_suffix(argv[optind++], NULL, STRTOSZ_DEFSUFFIX_B);
339 if (sval < 0) {
340 error("Invalid image size specified! You may use k, M, G or "
341 "T suffixes for ");
342 error("kilobytes, megabytes, gigabytes and terabytes.");
343 ret = -1;
344 goto out;
345 }
346 img_size = (uint64_t)sval;
347 }
348
4ac8aacd
JS
349 if (options && !strcmp(options, "?")) {
350 ret = print_block_option_help(filename, fmt);
351 goto out;
352 }
353
9ea2ea71
KW
354 /* Find driver and parse its options */
355 drv = bdrv_find_format(fmt);
c2abccec 356 if (!drv) {
9ea2ea71 357 error("Unknown file format '%s'", fmt);
2a81998a
JS
358 ret = -1;
359 goto out;
c2abccec 360 }
9230eaf6 361
b50cbabc 362 proto_drv = bdrv_find_protocol(filename);
c2abccec 363 if (!proto_drv) {
b50cbabc 364 error("Unknown protocol '%s'", filename);
2a81998a
JS
365 ret = -1;
366 goto out;
c2abccec 367 }
b50cbabc
MK
368
369 create_options = append_option_parameters(create_options,
370 drv->create_options);
371 create_options = append_option_parameters(create_options,
372 proto_drv->create_options);
373
9f56640c 374 /* Create parameter list with default values */
b50cbabc 375 param = parse_option_parameters("", create_options, param);
1da7cfbd
JS
376
377 set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
9f56640c
KW
378
379 /* Parse -o options */
9ea2ea71 380 if (options) {
b50cbabc 381 param = parse_option_parameters(options, create_options, param);
9ea2ea71
KW
382 if (param == NULL) {
383 error("Invalid options for file format '%s'.", fmt);
c2abccec
MK
384 ret = -1;
385 goto out;
9ea2ea71 386 }
9ea2ea71
KW
387 }
388
9ea2ea71 389 /* Add old-style options to parameters */
eec77d9e 390 ret = add_old_style_options(fmt, param, base_filename, base_fmt);
c2abccec
MK
391 if (ret < 0) {
392 goto out;
393 }
9ea2ea71 394
5eeaad5a
SH
395 backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
396 if (backing_fmt && backing_fmt->value.s) {
397 if (!bdrv_find_format(backing_fmt->value.s)) {
398 error("Unknown backing file format '%s'",
399 backing_fmt->value.s);
400 ret = -1;
401 goto out;
402 }
403 }
404
9ea2ea71
KW
405 // The size for the image must always be specified, with one exception:
406 // If we are using a backing file, we can obtain the size from there
9f56640c 407 if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
9ea2ea71
KW
408
409 QEMUOptionParameter *backing_file =
410 get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
9ea2ea71
KW
411
412 if (backing_file && backing_file->value.s) {
413 BlockDriverState *bs;
414 uint64_t size;
415 const char *fmt = NULL;
416 char buf[32];
417
418 if (backing_fmt && backing_fmt->value.s) {
5eeaad5a 419 fmt = backing_fmt->value.s;
9ea2ea71
KW
420 }
421
adfe078e 422 bs = bdrv_new_open(backing_file->value.s, fmt, BDRV_O_FLAGS);
c2abccec
MK
423 if (!bs) {
424 ret = -1;
425 goto out;
426 }
9ea2ea71
KW
427 bdrv_get_geometry(bs, &size);
428 size *= 512;
429 bdrv_delete(bs);
430
431 snprintf(buf, sizeof(buf), "%" PRId64, size);
432 set_option_parameter(param, BLOCK_OPT_SIZE, buf);
433 } else {
434 error("Image creation needs a size parameter");
c2abccec
MK
435 ret = -1;
436 goto out;
9ea2ea71 437 }
75c23805 438 }
9ea2ea71
KW
439
440 printf("Formatting '%s', fmt=%s ", filename, fmt);
441 print_option_parameters(param);
442 puts("");
443
444 ret = bdrv_create(drv, filename, param);
9ea2ea71 445
ea2384d3
FB
446 if (ret < 0) {
447 if (ret == -ENOTSUP) {
3c56521b 448 error("Formatting or formatting option not supported for file format '%s'", fmt);
6e9ea0c0
AJ
449 } else if (ret == -EFBIG) {
450 error("The image size is too large for file format '%s'", fmt);
ea2384d3 451 } else {
3e7896de 452 error("%s: error while creating %s: %s", filename, fmt, strerror(-ret));
ea2384d3
FB
453 }
454 }
c2abccec 455out:
a87a6721
SH
456 free_option_parameters(create_options);
457 free_option_parameters(param);
c2abccec
MK
458 if (ret) {
459 return 1;
460 }
ea2384d3
FB
461 return 0;
462}
463
e076f338
KW
464/*
465 * Checks an image for consistency. Exit codes:
466 *
467 * 0 - Check completed, image is good
468 * 1 - Check not completed because of internal errors
469 * 2 - Check completed, image is corrupted
470 * 3 - Check completed, image has leaked clusters, but is good otherwise
471 */
1585969c
AL
472static int img_check(int argc, char **argv)
473{
474 int c, ret;
475 const char *filename, *fmt;
1585969c 476 BlockDriverState *bs;
e076f338 477 BdrvCheckResult result;
1585969c
AL
478
479 fmt = NULL;
480 for(;;) {
481 c = getopt(argc, argv, "f:h");
b8fb60da 482 if (c == -1) {
1585969c 483 break;
b8fb60da 484 }
1585969c 485 switch(c) {
ef87394c 486 case '?':
1585969c
AL
487 case 'h':
488 help();
489 break;
490 case 'f':
491 fmt = optarg;
492 break;
493 }
494 }
b8fb60da 495 if (optind >= argc) {
1585969c 496 help();
b8fb60da 497 }
1585969c
AL
498 filename = argv[optind++];
499
adfe078e 500 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
c2abccec
MK
501 if (!bs) {
502 return 1;
503 }
e076f338
KW
504 ret = bdrv_check(bs, &result);
505
506 if (ret == -ENOTSUP) {
1585969c 507 error("This image format does not support checks");
e076f338
KW
508 bdrv_delete(bs);
509 return 1;
510 }
511
512 if (!(result.corruptions || result.leaks || result.check_errors)) {
513 printf("No errors were found on the image.\n");
514 } else {
515 if (result.corruptions) {
516 printf("\n%d errors were found on the image.\n"
517 "Data may be corrupted, or further writes to the image "
518 "may corrupt it.\n",
519 result.corruptions);
520 }
521
522 if (result.leaks) {
523 printf("\n%d leaked clusters were found on the image.\n"
524 "This means waste of disk space, but no harm to data.\n",
525 result.leaks);
526 }
527
528 if (result.check_errors) {
529 printf("\n%d internal errors have occurred during the check.\n",
530 result.check_errors);
1585969c 531 }
1585969c
AL
532 }
533
534 bdrv_delete(bs);
e076f338
KW
535
536 if (ret < 0 || result.check_errors) {
537 printf("\nAn error has occurred during the check: %s\n"
538 "The check is not complete and may have missed error.\n",
539 strerror(-ret));
c2abccec
MK
540 return 1;
541 }
e076f338
KW
542
543 if (result.corruptions) {
544 return 2;
545 } else if (result.leaks) {
546 return 3;
547 } else {
548 return 0;
549 }
1585969c
AL
550}
551
ea2384d3
FB
552static int img_commit(int argc, char **argv)
553{
554 int c, ret;
555 const char *filename, *fmt;
ea2384d3
FB
556 BlockDriverState *bs;
557
558 fmt = NULL;
559 for(;;) {
560 c = getopt(argc, argv, "f:h");
b8fb60da 561 if (c == -1) {
ea2384d3 562 break;
b8fb60da 563 }
ea2384d3 564 switch(c) {
ef87394c 565 case '?':
ea2384d3
FB
566 case 'h':
567 help();
568 break;
569 case 'f':
570 fmt = optarg;
571 break;
572 }
573 }
b8fb60da 574 if (optind >= argc) {
ea2384d3 575 help();
b8fb60da 576 }
ea2384d3
FB
577 filename = argv[optind++];
578
adfe078e 579 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
c2abccec
MK
580 if (!bs) {
581 return 1;
582 }
ea2384d3
FB
583 ret = bdrv_commit(bs);
584 switch(ret) {
585 case 0:
586 printf("Image committed.\n");
587 break;
588 case -ENOENT:
589 error("No disk inserted");
590 break;
591 case -EACCES:
592 error("Image is read-only");
593 break;
594 case -ENOTSUP:
595 error("Image is already committed");
596 break;
597 default:
598 error("Error while committing image");
599 break;
600 }
601
602 bdrv_delete(bs);
c2abccec
MK
603 if (ret) {
604 return 1;
605 }
ea2384d3
FB
606 return 0;
607}
608
609static int is_not_zero(const uint8_t *sector, int len)
610{
611 int i;
612 len >>= 2;
613 for(i = 0;i < len; i++) {
614 if (((uint32_t *)sector)[i] != 0)
615 return 1;
616 }
617 return 0;
618}
619
f58c7b35
TS
620/*
621 * Returns true iff the first sector pointed to by 'buf' contains at least
622 * a non-NUL byte.
623 *
624 * 'pnum' is set to the number of sectors (including and immediately following
625 * the first one) that are known to be in the same allocated/unallocated state.
626 */
ea2384d3
FB
627static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
628{
629 int v, i;
630
631 if (n <= 0) {
632 *pnum = 0;
633 return 0;
634 }
635 v = is_not_zero(buf, 512);
636 for(i = 1; i < n; i++) {
637 buf += 512;
638 if (v != is_not_zero(buf, 512))
639 break;
640 }
641 *pnum = i;
642 return v;
643}
644
3e85c6fd
KW
645/*
646 * Compares two buffers sector by sector. Returns 0 if the first sector of both
647 * buffers matches, non-zero otherwise.
648 *
649 * pnum is set to the number of sectors (including and immediately following
650 * the first one) that are known to have the same comparison result
651 */
652static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
653 int *pnum)
654{
655 int res, i;
656
657 if (n <= 0) {
658 *pnum = 0;
659 return 0;
660 }
661
662 res = !!memcmp(buf1, buf2, 512);
663 for(i = 1; i < n; i++) {
664 buf1 += 512;
665 buf2 += 512;
666
667 if (!!memcmp(buf1, buf2, 512) != res) {
668 break;
669 }
670 }
671
672 *pnum = i;
673 return res;
674}
675
80ee15a6 676#define IO_BUF_SIZE (2 * 1024 * 1024)
ea2384d3
FB
677
678static int img_convert(int argc, char **argv)
679{
eec77d9e 680 int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
f58c7b35 681 const char *fmt, *out_fmt, *out_baseimg, *out_filename;
b50cbabc 682 BlockDriver *drv, *proto_drv;
c2abccec 683 BlockDriverState **bs = NULL, *out_bs = NULL;
96b8f136
TS
684 int64_t total_sectors, nb_sectors, sector_num, bs_offset;
685 uint64_t bs_sectors;
c2abccec 686 uint8_t * buf = NULL;
ea2384d3 687 const uint8_t *buf1;
faea38e7 688 BlockDriverInfo bdi;
b50cbabc 689 QEMUOptionParameter *param = NULL, *create_options = NULL;
a18953fb 690 QEMUOptionParameter *out_baseimg_param;
efa84d43 691 char *options = NULL;
51ef6727 692 const char *snapshot_name = NULL;
ea2384d3
FB
693
694 fmt = NULL;
695 out_fmt = "raw";
f58c7b35 696 out_baseimg = NULL;
eec77d9e 697 compress = 0;
ea2384d3 698 for(;;) {
51ef6727 699 c = getopt(argc, argv, "f:O:B:s:hce6o:");
b8fb60da 700 if (c == -1) {
ea2384d3 701 break;
b8fb60da 702 }
ea2384d3 703 switch(c) {
ef87394c 704 case '?':
ea2384d3
FB
705 case 'h':
706 help();
707 break;
708 case 'f':
709 fmt = optarg;
710 break;
711 case 'O':
712 out_fmt = optarg;
713 break;
f58c7b35
TS
714 case 'B':
715 out_baseimg = optarg;
716 break;
ea2384d3 717 case 'c':
eec77d9e 718 compress = 1;
ea2384d3
FB
719 break;
720 case 'e':
eec77d9e
JS
721 error("qemu-img: option -e is deprecated, please use \'-o "
722 "encryption\' instead!");
723 return 1;
ec36ba14 724 case '6':
eec77d9e
JS
725 error("qemu-img: option -6 is deprecated, please use \'-o "
726 "compat6\' instead!");
727 return 1;
efa84d43
KW
728 case 'o':
729 options = optarg;
730 break;
51ef6727 731 case 's':
732 snapshot_name = optarg;
733 break;
ea2384d3
FB
734 }
735 }
3b46e624 736
926c2d23 737 bs_n = argc - optind - 1;
b8fb60da
JS
738 if (bs_n < 1) {
739 help();
740 }
926c2d23
AZ
741
742 out_filename = argv[argc - 1];
f58c7b35 743
4ac8aacd
JS
744 if (options && !strcmp(options, "?")) {
745 ret = print_block_option_help(out_filename, out_fmt);
746 goto out;
747 }
748
c2abccec 749 if (bs_n > 1 && out_baseimg) {
f58c7b35 750 error("-B makes no sense when concatenating multiple input images");
31ca34b8
JS
751 ret = -1;
752 goto out;
c2abccec 753 }
926c2d23 754
5bdf61fd 755 bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
926c2d23
AZ
756
757 total_sectors = 0;
758 for (bs_i = 0; bs_i < bs_n; bs_i++) {
adfe078e 759 bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
c2abccec 760 if (!bs[bs_i]) {
926c2d23 761 error("Could not open '%s'", argv[optind + bs_i]);
c2abccec
MK
762 ret = -1;
763 goto out;
764 }
926c2d23
AZ
765 bdrv_get_geometry(bs[bs_i], &bs_sectors);
766 total_sectors += bs_sectors;
767 }
ea2384d3 768
51ef6727 769 if (snapshot_name != NULL) {
770 if (bs_n > 1) {
771 error("No support for concatenating multiple snapshot\n");
772 ret = -1;
773 goto out;
774 }
775 if (bdrv_snapshot_load_tmp(bs[0], snapshot_name) < 0) {
776 error("Failed to load snapshot\n");
777 ret = -1;
778 goto out;
779 }
780 }
781
efa84d43 782 /* Find driver and parse its options */
ea2384d3 783 drv = bdrv_find_format(out_fmt);
c2abccec 784 if (!drv) {
d34dda5e 785 error("Unknown file format '%s'", out_fmt);
c2abccec
MK
786 ret = -1;
787 goto out;
788 }
efa84d43 789
b50cbabc 790 proto_drv = bdrv_find_protocol(out_filename);
c2abccec 791 if (!proto_drv) {
b50cbabc 792 error("Unknown protocol '%s'", out_filename);
c2abccec
MK
793 ret = -1;
794 goto out;
795 }
b50cbabc
MK
796
797 create_options = append_option_parameters(create_options,
798 drv->create_options);
799 create_options = append_option_parameters(create_options,
800 proto_drv->create_options);
db08adf5 801
efa84d43 802 if (options) {
b50cbabc 803 param = parse_option_parameters(options, create_options, param);
efa84d43
KW
804 if (param == NULL) {
805 error("Invalid options for file format '%s'.", out_fmt);
c2abccec
MK
806 ret = -1;
807 goto out;
efa84d43
KW
808 }
809 } else {
b50cbabc 810 param = parse_option_parameters("", create_options, param);
efa84d43
KW
811 }
812
813 set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
eec77d9e 814 ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
c2abccec
MK
815 if (ret < 0) {
816 goto out;
817 }
efa84d43 818
a18953fb
KW
819 /* Get backing file name if -o backing_file was used */
820 out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
821 if (out_baseimg_param) {
822 out_baseimg = out_baseimg_param->value.s;
823 }
824
efa84d43 825 /* Check if compression is supported */
eec77d9e 826 if (compress) {
efa84d43
KW
827 QEMUOptionParameter *encryption =
828 get_option_parameter(param, BLOCK_OPT_ENCRYPT);
829
830 if (!drv->bdrv_write_compressed) {
831 error("Compression not supported for this file format");
c2abccec
MK
832 ret = -1;
833 goto out;
efa84d43
KW
834 }
835
836 if (encryption && encryption->value.n) {
837 error("Compression and encryption not supported at the same time");
c2abccec
MK
838 ret = -1;
839 goto out;
efa84d43
KW
840 }
841 }
842
843 /* Create the new image */
844 ret = bdrv_create(drv, out_filename, param);
ea2384d3
FB
845 if (ret < 0) {
846 if (ret == -ENOTSUP) {
93c65b47 847 error("Formatting not supported for file format '%s'", out_fmt);
6e9ea0c0
AJ
848 } else if (ret == -EFBIG) {
849 error("The image size is too large for file format '%s'", out_fmt);
ea2384d3 850 } else {
3e7896de 851 error("%s: error while converting %s: %s", out_filename, out_fmt, strerror(-ret));
ea2384d3 852 }
c2abccec 853 goto out;
ea2384d3 854 }
3b46e624 855
1bd8e175
KW
856 out_bs = bdrv_new_open(out_filename, out_fmt,
857 BDRV_O_FLAGS | BDRV_O_RDWR | BDRV_O_NO_FLUSH);
c2abccec
MK
858 if (!out_bs) {
859 ret = -1;
860 goto out;
861 }
ea2384d3 862
926c2d23
AZ
863 bs_i = 0;
864 bs_offset = 0;
865 bdrv_get_geometry(bs[0], &bs_sectors);
d6771bfa 866 buf = qemu_malloc(IO_BUF_SIZE);
926c2d23 867
eec77d9e 868 if (compress) {
c2abccec
MK
869 ret = bdrv_get_info(out_bs, &bdi);
870 if (ret < 0) {
faea38e7 871 error("could not get block driver info");
c2abccec
MK
872 goto out;
873 }
faea38e7 874 cluster_size = bdi.cluster_size;
c2abccec 875 if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
ea2384d3 876 error("invalid cluster size");
c2abccec
MK
877 ret = -1;
878 goto out;
879 }
ea2384d3
FB
880 cluster_sectors = cluster_size >> 9;
881 sector_num = 0;
882 for(;;) {
926c2d23
AZ
883 int64_t bs_num;
884 int remainder;
885 uint8_t *buf2;
886
ea2384d3
FB
887 nb_sectors = total_sectors - sector_num;
888 if (nb_sectors <= 0)
889 break;
890 if (nb_sectors >= cluster_sectors)
891 n = cluster_sectors;
892 else
893 n = nb_sectors;
926c2d23
AZ
894
895 bs_num = sector_num - bs_offset;
896 assert (bs_num >= 0);
897 remainder = n;
898 buf2 = buf;
899 while (remainder > 0) {
900 int nlow;
901 while (bs_num == bs_sectors) {
902 bs_i++;
903 assert (bs_i < bs_n);
904 bs_offset += bs_sectors;
905 bdrv_get_geometry(bs[bs_i], &bs_sectors);
906 bs_num = 0;
0bfcd599
BS
907 /* printf("changing part: sector_num=%" PRId64 ", "
908 "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
909 "\n", sector_num, bs_i, bs_offset, bs_sectors); */
926c2d23
AZ
910 }
911 assert (bs_num < bs_sectors);
912
913 nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
914
c2abccec
MK
915 ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
916 if (ret < 0) {
926c2d23 917 error("error while reading");
c2abccec
MK
918 goto out;
919 }
926c2d23
AZ
920
921 buf2 += nlow * 512;
922 bs_num += nlow;
923
924 remainder -= nlow;
925 }
926 assert (remainder == 0);
927
b8fb60da 928 if (n < cluster_sectors) {
ea2384d3 929 memset(buf + n * 512, 0, cluster_size - n * 512);
b8fb60da 930 }
ea2384d3 931 if (is_not_zero(buf, cluster_size)) {
c2abccec
MK
932 ret = bdrv_write_compressed(out_bs, sector_num, buf,
933 cluster_sectors);
934 if (ret != 0) {
ec3757de
FB
935 error("error while compressing sector %" PRId64,
936 sector_num);
c2abccec
MK
937 goto out;
938 }
ea2384d3
FB
939 }
940 sector_num += n;
941 }
faea38e7
FB
942 /* signal EOF to align */
943 bdrv_write_compressed(out_bs, 0, NULL, 0);
ea2384d3 944 } else {
f2feebbd
KW
945 int has_zero_init = bdrv_has_zero_init(out_bs);
946
f58c7b35 947 sector_num = 0; // total number of sectors converted so far
ea2384d3
FB
948 for(;;) {
949 nb_sectors = total_sectors - sector_num;
b8fb60da 950 if (nb_sectors <= 0) {
ea2384d3 951 break;
b8fb60da
JS
952 }
953 if (nb_sectors >= (IO_BUF_SIZE / 512)) {
ea2384d3 954 n = (IO_BUF_SIZE / 512);
b8fb60da 955 } else {
ea2384d3 956 n = nb_sectors;
b8fb60da 957 }
926c2d23
AZ
958
959 while (sector_num - bs_offset >= bs_sectors) {
960 bs_i ++;
961 assert (bs_i < bs_n);
962 bs_offset += bs_sectors;
963 bdrv_get_geometry(bs[bs_i], &bs_sectors);
0bfcd599
BS
964 /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
965 "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
926c2d23
AZ
966 sector_num, bs_i, bs_offset, bs_sectors); */
967 }
968
b8fb60da 969 if (n > bs_offset + bs_sectors - sector_num) {
926c2d23 970 n = bs_offset + bs_sectors - sector_num;
b8fb60da 971 }
926c2d23 972
f2feebbd 973 if (has_zero_init) {
d032044f
AS
974 /* If the output image is being created as a copy on write image,
975 assume that sectors which are unallocated in the input image
976 are present in both the output's and input's base images (no
977 need to copy them). */
978 if (out_baseimg) {
979 if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
980 n, &n1)) {
981 sector_num += n1;
982 continue;
983 }
984 /* The next 'n1' sectors are allocated in the input image. Copy
985 only those as they may be followed by unallocated sectors. */
986 n = n1;
93c65b47 987 }
93c65b47
AL
988 } else {
989 n1 = n;
f58c7b35
TS
990 }
991
c2abccec
MK
992 ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
993 if (ret < 0) {
ea2384d3 994 error("error while reading");
c2abccec
MK
995 goto out;
996 }
ea2384d3
FB
997 /* NOTE: at the same time we convert, we do not write zero
998 sectors to have a chance to compress the image. Ideally, we
999 should add a specific call to have the info to go faster */
1000 buf1 = buf;
1001 while (n > 0) {
f58c7b35
TS
1002 /* If the output image is being created as a copy on write image,
1003 copy all sectors even the ones containing only NUL bytes,
93c65b47
AL
1004 because they may differ from the sectors in the base image.
1005
1006 If the output is to a host device, we also write out
1007 sectors that are entirely 0, since whatever data was
1008 already there is garbage, not 0s. */
f2feebbd 1009 if (!has_zero_init || out_baseimg ||
93c65b47 1010 is_allocated_sectors(buf1, n, &n1)) {
c2abccec
MK
1011 ret = bdrv_write(out_bs, sector_num, buf1, n1);
1012 if (ret < 0) {
ea2384d3 1013 error("error while writing");
c2abccec
MK
1014 goto out;
1015 }
ea2384d3
FB
1016 }
1017 sector_num += n1;
1018 n -= n1;
1019 buf1 += n1 * 512;
1020 }
1021 }
1022 }
c2abccec
MK
1023out:
1024 free_option_parameters(create_options);
1025 free_option_parameters(param);
d6771bfa 1026 qemu_free(buf);
c2abccec
MK
1027 if (out_bs) {
1028 bdrv_delete(out_bs);
1029 }
31ca34b8
JS
1030 if (bs) {
1031 for (bs_i = 0; bs_i < bs_n; bs_i++) {
1032 if (bs[bs_i]) {
1033 bdrv_delete(bs[bs_i]);
1034 }
c2abccec 1035 }
31ca34b8 1036 qemu_free(bs);
c2abccec 1037 }
c2abccec
MK
1038 if (ret) {
1039 return 1;
1040 }
ea2384d3
FB
1041 return 0;
1042}
1043
57d1a2b6
FB
1044#ifdef _WIN32
1045static int64_t get_allocated_file_size(const char *filename)
1046{
e8445331
FB
1047 typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
1048 get_compressed_t get_compressed;
57d1a2b6 1049 struct _stati64 st;
e8445331
FB
1050
1051 /* WinNT support GetCompressedFileSize to determine allocate size */
1052 get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
1053 if (get_compressed) {
1054 DWORD high, low;
1055 low = get_compressed(filename, &high);
1056 if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
1057 return (((int64_t) high) << 32) + low;
1058 }
1059
5fafdf24 1060 if (_stati64(filename, &st) < 0)
57d1a2b6
FB
1061 return -1;
1062 return st.st_size;
1063}
1064#else
1065static int64_t get_allocated_file_size(const char *filename)
1066{
1067 struct stat st;
5fafdf24 1068 if (stat(filename, &st) < 0)
57d1a2b6
FB
1069 return -1;
1070 return (int64_t)st.st_blocks * 512;
1071}
1072#endif
1073
faea38e7
FB
1074static void dump_snapshots(BlockDriverState *bs)
1075{
1076 QEMUSnapshotInfo *sn_tab, *sn;
1077 int nb_sns, i;
1078 char buf[256];
1079
1080 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1081 if (nb_sns <= 0)
1082 return;
1083 printf("Snapshot list:\n");
1084 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1085 for(i = 0; i < nb_sns; i++) {
1086 sn = &sn_tab[i];
1087 printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1088 }
1089 qemu_free(sn_tab);
1090}
1091
ea2384d3
FB
1092static int img_info(int argc, char **argv)
1093{
1094 int c;
1095 const char *filename, *fmt;
ea2384d3
FB
1096 BlockDriverState *bs;
1097 char fmt_name[128], size_buf[128], dsize_buf[128];
96b8f136
TS
1098 uint64_t total_sectors;
1099 int64_t allocated_size;
93b6b2a3
FB
1100 char backing_filename[1024];
1101 char backing_filename2[1024];
faea38e7 1102 BlockDriverInfo bdi;
ea2384d3
FB
1103
1104 fmt = NULL;
1105 for(;;) {
1106 c = getopt(argc, argv, "f:h");
b8fb60da 1107 if (c == -1) {
ea2384d3 1108 break;
b8fb60da 1109 }
ea2384d3 1110 switch(c) {
ef87394c 1111 case '?':
ea2384d3
FB
1112 case 'h':
1113 help();
1114 break;
1115 case 'f':
1116 fmt = optarg;
1117 break;
1118 }
1119 }
b8fb60da 1120 if (optind >= argc) {
ea2384d3 1121 help();
b8fb60da 1122 }
ea2384d3
FB
1123 filename = argv[optind++];
1124
adfe078e 1125 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
c2abccec
MK
1126 if (!bs) {
1127 return 1;
1128 }
ea2384d3
FB
1129 bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1130 bdrv_get_geometry(bs, &total_sectors);
1131 get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
57d1a2b6 1132 allocated_size = get_allocated_file_size(filename);
b8fb60da 1133 if (allocated_size < 0) {
a10ea30b 1134 snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
b8fb60da 1135 } else {
5fafdf24 1136 get_human_readable_size(dsize_buf, sizeof(dsize_buf),
de167e41 1137 allocated_size);
b8fb60da 1138 }
ea2384d3
FB
1139 printf("image: %s\n"
1140 "file format: %s\n"
ec3757de 1141 "virtual size: %s (%" PRId64 " bytes)\n"
ea2384d3 1142 "disk size: %s\n",
5fafdf24 1143 filename, fmt_name, size_buf,
ec3757de 1144 (total_sectors * 512),
ea2384d3 1145 dsize_buf);
b8fb60da 1146 if (bdrv_is_encrypted(bs)) {
ea2384d3 1147 printf("encrypted: yes\n");
b8fb60da 1148 }
faea38e7 1149 if (bdrv_get_info(bs, &bdi) >= 0) {
b8fb60da 1150 if (bdi.cluster_size != 0) {
faea38e7 1151 printf("cluster_size: %d\n", bdi.cluster_size);
b8fb60da 1152 }
faea38e7 1153 }
93b6b2a3 1154 bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
faea38e7 1155 if (backing_filename[0] != '\0') {
93b6b2a3
FB
1156 path_combine(backing_filename2, sizeof(backing_filename2),
1157 filename, backing_filename);
5fafdf24 1158 printf("backing file: %s (actual path: %s)\n",
93b6b2a3
FB
1159 backing_filename,
1160 backing_filename2);
faea38e7
FB
1161 }
1162 dump_snapshots(bs);
ea2384d3
FB
1163 bdrv_delete(bs);
1164 return 0;
1165}
1166
f7b4a940
AL
1167#define SNAPSHOT_LIST 1
1168#define SNAPSHOT_CREATE 2
1169#define SNAPSHOT_APPLY 3
1170#define SNAPSHOT_DELETE 4
1171
153859be 1172static int img_snapshot(int argc, char **argv)
f7b4a940
AL
1173{
1174 BlockDriverState *bs;
1175 QEMUSnapshotInfo sn;
1176 char *filename, *snapshot_name = NULL;
c2abccec 1177 int c, ret = 0, bdrv_oflags;
f7b4a940
AL
1178 int action = 0;
1179 qemu_timeval tv;
1180
f5edb014 1181 bdrv_oflags = BDRV_O_RDWR;
f7b4a940
AL
1182 /* Parse commandline parameters */
1183 for(;;) {
1184 c = getopt(argc, argv, "la:c:d:h");
b8fb60da 1185 if (c == -1) {
f7b4a940 1186 break;
b8fb60da 1187 }
f7b4a940 1188 switch(c) {
ef87394c 1189 case '?':
f7b4a940
AL
1190 case 'h':
1191 help();
153859be 1192 return 0;
f7b4a940
AL
1193 case 'l':
1194 if (action) {
1195 help();
153859be 1196 return 0;
f7b4a940
AL
1197 }
1198 action = SNAPSHOT_LIST;
f5edb014 1199 bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
f7b4a940
AL
1200 break;
1201 case 'a':
1202 if (action) {
1203 help();
153859be 1204 return 0;
f7b4a940
AL
1205 }
1206 action = SNAPSHOT_APPLY;
1207 snapshot_name = optarg;
1208 break;
1209 case 'c':
1210 if (action) {
1211 help();
153859be 1212 return 0;
f7b4a940
AL
1213 }
1214 action = SNAPSHOT_CREATE;
1215 snapshot_name = optarg;
1216 break;
1217 case 'd':
1218 if (action) {
1219 help();
153859be 1220 return 0;
f7b4a940
AL
1221 }
1222 action = SNAPSHOT_DELETE;
1223 snapshot_name = optarg;
1224 break;
1225 }
1226 }
1227
b8fb60da 1228 if (optind >= argc) {
f7b4a940 1229 help();
b8fb60da 1230 }
f7b4a940
AL
1231 filename = argv[optind++];
1232
1233 /* Open the image */
f163d073 1234 bs = bdrv_new_open(filename, NULL, bdrv_oflags);
c2abccec
MK
1235 if (!bs) {
1236 return 1;
1237 }
f7b4a940
AL
1238
1239 /* Perform the requested action */
1240 switch(action) {
1241 case SNAPSHOT_LIST:
1242 dump_snapshots(bs);
1243 break;
1244
1245 case SNAPSHOT_CREATE:
1246 memset(&sn, 0, sizeof(sn));
1247 pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1248
1249 qemu_gettimeofday(&tv);
1250 sn.date_sec = tv.tv_sec;
1251 sn.date_nsec = tv.tv_usec * 1000;
1252
1253 ret = bdrv_snapshot_create(bs, &sn);
b8fb60da 1254 if (ret) {
f7b4a940
AL
1255 error("Could not create snapshot '%s': %d (%s)",
1256 snapshot_name, ret, strerror(-ret));
b8fb60da 1257 }
f7b4a940
AL
1258 break;
1259
1260 case SNAPSHOT_APPLY:
1261 ret = bdrv_snapshot_goto(bs, snapshot_name);
b8fb60da 1262 if (ret) {
f7b4a940
AL
1263 error("Could not apply snapshot '%s': %d (%s)",
1264 snapshot_name, ret, strerror(-ret));
b8fb60da 1265 }
f7b4a940
AL
1266 break;
1267
1268 case SNAPSHOT_DELETE:
1269 ret = bdrv_snapshot_delete(bs, snapshot_name);
b8fb60da 1270 if (ret) {
f7b4a940
AL
1271 error("Could not delete snapshot '%s': %d (%s)",
1272 snapshot_name, ret, strerror(-ret));
b8fb60da 1273 }
f7b4a940
AL
1274 break;
1275 }
1276
1277 /* Cleanup */
1278 bdrv_delete(bs);
c2abccec
MK
1279 if (ret) {
1280 return 1;
1281 }
153859be 1282 return 0;
f7b4a940
AL
1283}
1284
3e85c6fd
KW
1285static int img_rebase(int argc, char **argv)
1286{
c2abccec 1287 BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
f163d073 1288 BlockDriver *old_backing_drv, *new_backing_drv;
3e85c6fd 1289 char *filename;
e53dbee0 1290 const char *fmt, *out_basefmt, *out_baseimg;
3e85c6fd
KW
1291 int c, flags, ret;
1292 int unsafe = 0;
1293
1294 /* Parse commandline parameters */
e53dbee0 1295 fmt = NULL;
3e85c6fd
KW
1296 out_baseimg = NULL;
1297 out_basefmt = NULL;
1298
1299 for(;;) {
e53dbee0 1300 c = getopt(argc, argv, "uhf:F:b:");
b8fb60da 1301 if (c == -1) {
3e85c6fd 1302 break;
b8fb60da 1303 }
3e85c6fd 1304 switch(c) {
ef87394c 1305 case '?':
3e85c6fd
KW
1306 case 'h':
1307 help();
1308 return 0;
e53dbee0
KW
1309 case 'f':
1310 fmt = optarg;
1311 break;
3e85c6fd
KW
1312 case 'F':
1313 out_basefmt = optarg;
1314 break;
1315 case 'b':
1316 out_baseimg = optarg;
1317 break;
1318 case 'u':
1319 unsafe = 1;
1320 break;
1321 }
1322 }
1323
b8fb60da 1324 if ((optind >= argc) || !out_baseimg) {
3e85c6fd 1325 help();
b8fb60da 1326 }
3e85c6fd
KW
1327 filename = argv[optind++];
1328
1329 /*
1330 * Open the images.
1331 *
1332 * Ignore the old backing file for unsafe rebase in case we want to correct
1333 * the reference to a renamed or moved backing file.
1334 */
adfe078e 1335 flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
f163d073 1336 bs = bdrv_new_open(filename, fmt, flags);
c2abccec
MK
1337 if (!bs) {
1338 return 1;
1339 }
3e85c6fd
KW
1340
1341 /* Find the right drivers for the backing files */
1342 old_backing_drv = NULL;
1343 new_backing_drv = NULL;
1344
1345 if (!unsafe && bs->backing_format[0] != '\0') {
1346 old_backing_drv = bdrv_find_format(bs->backing_format);
1347 if (old_backing_drv == NULL) {
1348 error("Invalid format name: '%s'", bs->backing_format);
c2abccec
MK
1349 ret = -1;
1350 goto out;
3e85c6fd
KW
1351 }
1352 }
1353
1354 if (out_basefmt != NULL) {
1355 new_backing_drv = bdrv_find_format(out_basefmt);
1356 if (new_backing_drv == NULL) {
1357 error("Invalid format name: '%s'", out_basefmt);
c2abccec
MK
1358 ret = -1;
1359 goto out;
3e85c6fd
KW
1360 }
1361 }
1362
1363 /* For safe rebasing we need to compare old and new backing file */
1364 if (unsafe) {
1365 /* Make the compiler happy */
1366 bs_old_backing = NULL;
1367 bs_new_backing = NULL;
1368 } else {
1369 char backing_name[1024];
1370
1371 bs_old_backing = bdrv_new("old_backing");
1372 bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
c2abccec
MK
1373 ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1374 old_backing_drv);
1375 if (ret) {
3e85c6fd 1376 error("Could not open old backing file '%s'", backing_name);
c2abccec 1377 goto out;
3e85c6fd
KW
1378 }
1379
1380 bs_new_backing = bdrv_new("new_backing");
cdbae851 1381 ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
c2abccec
MK
1382 new_backing_drv);
1383 if (ret) {
584771e6 1384 error("Could not open new backing file '%s'", out_baseimg);
c2abccec 1385 goto out;
3e85c6fd
KW
1386 }
1387 }
1388
1389 /*
1390 * Check each unallocated cluster in the COW file. If it is unallocated,
1391 * accesses go to the backing file. We must therefore compare this cluster
1392 * in the old and new backing file, and if they differ we need to copy it
1393 * from the old backing file into the COW file.
1394 *
1395 * If qemu-img crashes during this step, no harm is done. The content of
1396 * the image is the same as the original one at any time.
1397 */
1398 if (!unsafe) {
1399 uint64_t num_sectors;
1400 uint64_t sector;
cc60e327 1401 int n;
d6771bfa
T
1402 uint8_t * buf_old;
1403 uint8_t * buf_new;
1404
1405 buf_old = qemu_malloc(IO_BUF_SIZE);
1406 buf_new = qemu_malloc(IO_BUF_SIZE);
3e85c6fd
KW
1407
1408 bdrv_get_geometry(bs, &num_sectors);
1409
1410 for (sector = 0; sector < num_sectors; sector += n) {
1411
1412 /* How many sectors can we handle with the next read? */
1413 if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1414 n = (IO_BUF_SIZE / 512);
1415 } else {
1416 n = num_sectors - sector;
1417 }
1418
1419 /* If the cluster is allocated, we don't need to take action */
cc60e327
KW
1420 ret = bdrv_is_allocated(bs, sector, n, &n);
1421 if (ret) {
3e85c6fd
KW
1422 continue;
1423 }
1424
1425 /* Read old and new backing file */
c2abccec
MK
1426 ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1427 if (ret < 0) {
3e85c6fd 1428 error("error while reading from old backing file");
c2abccec 1429 goto out;
3e85c6fd 1430 }
c2abccec
MK
1431 ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1432 if (ret < 0) {
3e85c6fd 1433 error("error while reading from new backing file");
c2abccec 1434 goto out;
3e85c6fd
KW
1435 }
1436
1437 /* If they differ, we need to write to the COW file */
1438 uint64_t written = 0;
1439
1440 while (written < n) {
1441 int pnum;
1442
1443 if (compare_sectors(buf_old + written * 512,
60b1bd4f 1444 buf_new + written * 512, n - written, &pnum))
3e85c6fd
KW
1445 {
1446 ret = bdrv_write(bs, sector + written,
1447 buf_old + written * 512, pnum);
1448 if (ret < 0) {
1449 error("Error while writing to COW image: %s",
1450 strerror(-ret));
c2abccec 1451 goto out;
3e85c6fd
KW
1452 }
1453 }
1454
1455 written += pnum;
1456 }
1457 }
d6771bfa
T
1458
1459 qemu_free(buf_old);
1460 qemu_free(buf_new);
3e85c6fd
KW
1461 }
1462
1463 /*
1464 * Change the backing file. All clusters that are different from the old
1465 * backing file are overwritten in the COW file now, so the visible content
1466 * doesn't change when we switch the backing file.
1467 */
1468 ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1469 if (ret == -ENOSPC) {
1470 error("Could not change the backing file to '%s': No space left in "
1471 "the file header", out_baseimg);
1472 } else if (ret < 0) {
1473 error("Could not change the backing file to '%s': %s",
1474 out_baseimg, strerror(-ret));
1475 }
1476
1477 /*
1478 * TODO At this point it is possible to check if any clusters that are
1479 * allocated in the COW file are the same in the backing file. If so, they
1480 * could be dropped from the COW file. Don't do this before switching the
1481 * backing file, in case of a crash this would lead to corruption.
1482 */
c2abccec 1483out:
3e85c6fd
KW
1484 /* Cleanup */
1485 if (!unsafe) {
1486 bdrv_delete(bs_old_backing);
1487 bdrv_delete(bs_new_backing);
1488 }
1489
1490 bdrv_delete(bs);
c2abccec
MK
1491 if (ret) {
1492 return 1;
1493 }
3e85c6fd
KW
1494 return 0;
1495}
1496
ae6b0ed6
SH
1497static int img_resize(int argc, char **argv)
1498{
1499 int c, ret, relative;
1500 const char *filename, *fmt, *size;
1501 int64_t n, total_size;
2a81998a 1502 BlockDriverState *bs = NULL;
ae6b0ed6
SH
1503 QEMUOptionParameter *param;
1504 QEMUOptionParameter resize_options[] = {
1505 {
1506 .name = BLOCK_OPT_SIZE,
1507 .type = OPT_SIZE,
1508 .help = "Virtual disk size"
1509 },
1510 { NULL }
1511 };
1512
1513 fmt = NULL;
1514 for(;;) {
1515 c = getopt(argc, argv, "f:h");
1516 if (c == -1) {
1517 break;
1518 }
1519 switch(c) {
ef87394c 1520 case '?':
ae6b0ed6
SH
1521 case 'h':
1522 help();
1523 break;
1524 case 'f':
1525 fmt = optarg;
1526 break;
1527 }
1528 }
1529 if (optind + 1 >= argc) {
1530 help();
1531 }
1532 filename = argv[optind++];
1533 size = argv[optind++];
1534
1535 /* Choose grow, shrink, or absolute resize mode */
1536 switch (size[0]) {
1537 case '+':
1538 relative = 1;
1539 size++;
1540 break;
1541 case '-':
1542 relative = -1;
1543 size++;
1544 break;
1545 default:
1546 relative = 0;
1547 break;
1548 }
1549
1550 /* Parse size */
1551 param = parse_option_parameters("", resize_options, NULL);
1552 if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1553 /* Error message already printed when size parsing fails */
2a81998a
JS
1554 ret = -1;
1555 goto out;
ae6b0ed6
SH
1556 }
1557 n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1558 free_option_parameters(param);
1559
1560 bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
c2abccec 1561 if (!bs) {
2a81998a
JS
1562 ret = -1;
1563 goto out;
c2abccec 1564 }
ae6b0ed6
SH
1565
1566 if (relative) {
1567 total_size = bdrv_getlength(bs) + n * relative;
1568 } else {
1569 total_size = n;
1570 }
1571 if (total_size <= 0) {
1572 error("New image size must be positive");
c2abccec
MK
1573 ret = -1;
1574 goto out;
ae6b0ed6
SH
1575 }
1576
1577 ret = bdrv_truncate(bs, total_size);
1578 switch (ret) {
1579 case 0:
1580 printf("Image resized.\n");
1581 break;
1582 case -ENOTSUP:
1583 error("This image format does not support resize");
1584 break;
1585 case -EACCES:
1586 error("Image is read-only");
1587 break;
1588 default:
1589 error("Error resizing image (%d)", -ret);
1590 break;
1591 }
c2abccec 1592out:
2a81998a
JS
1593 if (bs) {
1594 bdrv_delete(bs);
1595 }
c2abccec
MK
1596 if (ret) {
1597 return 1;
1598 }
ae6b0ed6
SH
1599 return 0;
1600}
1601
c227f099 1602static const img_cmd_t img_cmds[] = {
153859be
SB
1603#define DEF(option, callback, arg_string) \
1604 { option, callback },
1605#include "qemu-img-cmds.h"
1606#undef DEF
1607#undef GEN_DOCS
1608 { NULL, NULL, },
1609};
1610
ea2384d3
FB
1611int main(int argc, char **argv)
1612{
c227f099 1613 const img_cmd_t *cmd;
153859be 1614 const char *cmdname;
ea2384d3 1615
53f76e58
KW
1616 error_set_progname(argv[0]);
1617
ea2384d3
FB
1618 bdrv_init();
1619 if (argc < 2)
1620 help();
153859be 1621 cmdname = argv[1];
8f9b157e 1622 argc--; argv++;
153859be
SB
1623
1624 /* find the command */
1625 for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1626 if (!strcmp(cmdname, cmd->name)) {
1627 return cmd->handler(argc, argv);
1628 }
ea2384d3 1629 }
153859be
SB
1630
1631 /* not found */
1632 help();
ea2384d3
FB
1633 return 0;
1634}