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