Statistics
| Branch: | Revision:

root / qemu-img.c @ 53f76e58

History | View | Annotate | Download (44.6 kB)

1
/*
2
 * QEMU disk image utility
3
 *
4
 * Copyright (c) 2003-2008 Fabrice Bellard
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "qemu-common.h"
25
#include "qemu-option.h"
26
#include "qemu-error.h"
27
#include "osdep.h"
28
#include "sysemu.h"
29
#include "block_int.h"
30
#include <stdio.h>
31

    
32
#ifdef _WIN32
33
#include <windows.h>
34
#endif
35

    
36
typedef struct img_cmd_t {
37
    const char *name;
38
    int (*handler)(int argc, char **argv);
39
} img_cmd_t;
40

    
41
/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
42
#define BDRV_O_FLAGS BDRV_O_CACHE_WB
43

    
44
static void GCC_FMT_ATTR(1, 2) error(const char *fmt, ...)
45
{
46
    va_list ap;
47
    va_start(ap, fmt);
48
    fprintf(stderr, "qemu-img: ");
49
    vfprintf(stderr, fmt, ap);
50
    fprintf(stderr, "\n");
51
    va_end(ap);
52
}
53

    
54
static void format_print(void *opaque, const char *name)
55
{
56
    printf(" %s", name);
57
}
58

    
59
/* Please keep in synch with qemu-img.texi */
60
static void help(void)
61
{
62
    const char *help_msg =
63
           "qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
64
           "usage: qemu-img command [command options]\n"
65
           "QEMU disk image utility\n"
66
           "\n"
67
           "Command syntax:\n"
68
#define DEF(option, callback, arg_string)        \
69
           "  " arg_string "\n"
70
#include "qemu-img-cmds.h"
71
#undef DEF
72
#undef GEN_DOCS
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"
96
           "  '-l' lists all snapshots in the given image\n";
97

    
98
    printf("%s\nSupported formats:", help_msg);
99
    bdrv_iterate_format(format_print, NULL);
100
    printf("\n");
101
    exit(1);
102
}
103

    
104
#if defined(WIN32)
105
/* XXX: put correct support for win32 */
106
static 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

    
127
static struct termios oldtty;
128

    
129
static void term_exit(void)
130
{
131
    tcsetattr (0, TCSANOW, &oldtty);
132
}
133

    
134
static 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;
149

    
150
    tcsetattr (0, TCSANOW, &tty);
151

    
152
    atexit(term_exit);
153
}
154

    
155
static int read_password(char *buf, int buf_size)
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

    
192
static 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

    
219
static BlockDriverState *bdrv_new_open(const char *filename,
220
                                       const char *fmt,
221
                                       int flags)
222
{
223
    BlockDriverState *bs;
224
    BlockDriver *drv;
225
    char password[256];
226

    
227
    bs = bdrv_new("");
228
    if (!bs) {
229
        error("Not enough memory");
230
        goto fail;
231
    }
232
    if (fmt) {
233
        drv = bdrv_find_format(fmt);
234
        if (!drv) {
235
            error("Unknown file format '%s'", fmt);
236
            goto fail;
237
        }
238
    } else {
239
        drv = NULL;
240
    }
241
    if (bdrv_open(bs, filename, flags, drv) < 0) {
242
        error("Could not open '%s'", filename);
243
        goto fail;
244
    }
245
    if (bdrv_is_encrypted(bs)) {
246
        printf("Disk image '%s' is encrypted.\n", filename);
247
        if (read_password(password, sizeof(password)) < 0) {
248
            error("No password given");
249
            goto fail;
250
        }
251
        if (bdrv_set_key(bs, password) < 0) {
252
            error("invalid password");
253
            goto fail;
254
        }
255
    }
256
    return bs;
257
fail:
258
    if (bs) {
259
        bdrv_delete(bs);
260
    }
261
    return NULL;
262
}
263

    
264
static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
265
                                 const char *base_filename,
266
                                 const char *base_fmt)
267
{
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);
271
            return -1;
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);
277
            return -1;
278
        }
279
    }
280
    return 0;
281
}
282

    
283
static int img_create(int argc, char **argv)
284
{
285
    int c, ret = 0;
286
    uint64_t img_size = -1;
287
    const char *fmt = "raw";
288
    const char *base_fmt = NULL;
289
    const char *filename;
290
    const char *base_filename = NULL;
291
    BlockDriver *drv, *proto_drv;
292
    QEMUOptionParameter *param = NULL, *create_options = NULL;
293
    QEMUOptionParameter *backing_fmt = NULL;
294
    char *options = NULL;
295

    
296
    for(;;) {
297
        c = getopt(argc, argv, "F:b:f:he6o:");
298
        if (c == -1) {
299
            break;
300
        }
301
        switch(c) {
302
        case '?':
303
        case 'h':
304
            help();
305
            break;
306
        case 'F':
307
            base_fmt = optarg;
308
            break;
309
        case 'b':
310
            base_filename = optarg;
311
            break;
312
        case 'f':
313
            fmt = optarg;
314
            break;
315
        case 'e':
316
            error("qemu-img: option -e is deprecated, please use \'-o "
317
                  "encryption\' instead!");
318
            return 1;
319
        case '6':
320
            error("qemu-img: option -6 is deprecated, please use \'-o "
321
                  "compat6\' instead!");
322
            return 1;
323
        case 'o':
324
            options = optarg;
325
            break;
326
        }
327
    }
328

    
329
    /* Get the filename */
330
    if (optind >= argc) {
331
        help();
332
    }
333
    filename = argv[optind++];
334

    
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

    
349
    if (options && !strcmp(options, "?")) {
350
        ret = print_block_option_help(filename, fmt);
351
        goto out;
352
    }
353

    
354
    /* Find driver and parse its options */
355
    drv = bdrv_find_format(fmt);
356
    if (!drv) {
357
        error("Unknown file format '%s'", fmt);
358
        ret = -1;
359
        goto out;
360
    }
361

    
362
    proto_drv = bdrv_find_protocol(filename);
363
    if (!proto_drv) {
364
        error("Unknown protocol '%s'", filename);
365
        ret = -1;
366
        goto out;
367
    }
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

    
374
    /* Create parameter list with default values */
375
    param = parse_option_parameters("", create_options, param);
376

    
377
    set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
378

    
379
    /* Parse -o options */
380
    if (options) {
381
        param = parse_option_parameters(options, create_options, param);
382
        if (param == NULL) {
383
            error("Invalid options for file format '%s'.", fmt);
384
            ret = -1;
385
            goto out;
386
        }
387
    }
388

    
389
    /* Add old-style options to parameters */
390
    ret = add_old_style_options(fmt, param, base_filename, base_fmt);
391
    if (ret < 0) {
392
        goto out;
393
    }
394

    
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

    
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
407
    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
408

    
409
        QEMUOptionParameter *backing_file =
410
            get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
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) {
419
                fmt = backing_fmt->value.s;
420
            }
421

    
422
            bs = bdrv_new_open(backing_file->value.s, fmt, BDRV_O_FLAGS);
423
            if (!bs) {
424
                ret = -1;
425
                goto out;
426
            }
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");
435
            ret = -1;
436
            goto out;
437
        }
438
    }
439

    
440
    printf("Formatting '%s', fmt=%s ", filename, fmt);
441
    print_option_parameters(param);
442
    puts("");
443

    
444
    ret = bdrv_create(drv, filename, param);
445

    
446
    if (ret < 0) {
447
        if (ret == -ENOTSUP) {
448
            error("Formatting or formatting option not supported for file format '%s'", fmt);
449
        } else if (ret == -EFBIG) {
450
            error("The image size is too large for file format '%s'", fmt);
451
        } else {
452
            error("%s: error while creating %s: %s", filename, fmt, strerror(-ret));
453
        }
454
    }
455
out:
456
    free_option_parameters(create_options);
457
    free_option_parameters(param);
458
    if (ret) {
459
        return 1;
460
    }
461
    return 0;
462
}
463

    
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
 */
472
static int img_check(int argc, char **argv)
473
{
474
    int c, ret;
475
    const char *filename, *fmt;
476
    BlockDriverState *bs;
477
    BdrvCheckResult result;
478

    
479
    fmt = NULL;
480
    for(;;) {
481
        c = getopt(argc, argv, "f:h");
482
        if (c == -1) {
483
            break;
484
        }
485
        switch(c) {
486
        case '?':
487
        case 'h':
488
            help();
489
            break;
490
        case 'f':
491
            fmt = optarg;
492
            break;
493
        }
494
    }
495
    if (optind >= argc) {
496
        help();
497
    }
498
    filename = argv[optind++];
499

    
500
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS);
501
    if (!bs) {
502
        return 1;
503
    }
504
    ret = bdrv_check(bs, &result);
505

    
506
    if (ret == -ENOTSUP) {
507
        error("This image format does not support checks");
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);
531
        }
532
    }
533

    
534
    bdrv_delete(bs);
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));
540
        return 1;
541
    }
542

    
543
    if (result.corruptions) {
544
        return 2;
545
    } else if (result.leaks) {
546
        return 3;
547
    } else {
548
        return 0;
549
    }
550
}
551

    
552
static int img_commit(int argc, char **argv)
553
{
554
    int c, ret;
555
    const char *filename, *fmt;
556
    BlockDriverState *bs;
557

    
558
    fmt = NULL;
559
    for(;;) {
560
        c = getopt(argc, argv, "f:h");
561
        if (c == -1) {
562
            break;
563
        }
564
        switch(c) {
565
        case '?':
566
        case 'h':
567
            help();
568
            break;
569
        case 'f':
570
            fmt = optarg;
571
            break;
572
        }
573
    }
574
    if (optind >= argc) {
575
        help();
576
    }
577
    filename = argv[optind++];
578

    
579
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
580
    if (!bs) {
581
        return 1;
582
    }
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);
603
    if (ret) {
604
        return 1;
605
    }
606
    return 0;
607
}
608

    
609
static 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

    
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
 */
627
static 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

    
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
 */
652
static 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

    
676
#define IO_BUF_SIZE (2 * 1024 * 1024)
677

    
678
static int img_convert(int argc, char **argv)
679
{
680
    int c, ret = 0, n, n1, bs_n, bs_i, compress, cluster_size, cluster_sectors;
681
    const char *fmt, *out_fmt, *out_baseimg, *out_filename;
682
    BlockDriver *drv, *proto_drv;
683
    BlockDriverState **bs = NULL, *out_bs = NULL;
684
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
685
    uint64_t bs_sectors;
686
    uint8_t * buf = NULL;
687
    const uint8_t *buf1;
688
    BlockDriverInfo bdi;
689
    QEMUOptionParameter *param = NULL, *create_options = NULL;
690
    QEMUOptionParameter *out_baseimg_param;
691
    char *options = NULL;
692
    const char *snapshot_name = NULL;
693

    
694
    fmt = NULL;
695
    out_fmt = "raw";
696
    out_baseimg = NULL;
697
    compress = 0;
698
    for(;;) {
699
        c = getopt(argc, argv, "f:O:B:s:hce6o:");
700
        if (c == -1) {
701
            break;
702
        }
703
        switch(c) {
704
        case '?':
705
        case 'h':
706
            help();
707
            break;
708
        case 'f':
709
            fmt = optarg;
710
            break;
711
        case 'O':
712
            out_fmt = optarg;
713
            break;
714
        case 'B':
715
            out_baseimg = optarg;
716
            break;
717
        case 'c':
718
            compress = 1;
719
            break;
720
        case 'e':
721
            error("qemu-img: option -e is deprecated, please use \'-o "
722
                  "encryption\' instead!");
723
            return 1;
724
        case '6':
725
            error("qemu-img: option -6 is deprecated, please use \'-o "
726
                  "compat6\' instead!");
727
            return 1;
728
        case 'o':
729
            options = optarg;
730
            break;
731
        case 's':
732
            snapshot_name = optarg;
733
            break;
734
        }
735
    }
736

    
737
    bs_n = argc - optind - 1;
738
    if (bs_n < 1) {
739
        help();
740
    }
741

    
742
    out_filename = argv[argc - 1];
743

    
744
    if (options && !strcmp(options, "?")) {
745
        ret = print_block_option_help(out_filename, out_fmt);
746
        goto out;
747
    }
748

    
749
    if (bs_n > 1 && out_baseimg) {
750
        error("-B makes no sense when concatenating multiple input images");
751
        ret = -1;
752
        goto out;
753
    }
754
        
755
    bs = qemu_mallocz(bs_n * sizeof(BlockDriverState *));
756

    
757
    total_sectors = 0;
758
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
759
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
760
        if (!bs[bs_i]) {
761
            error("Could not open '%s'", argv[optind + bs_i]);
762
            ret = -1;
763
            goto out;
764
        }
765
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
766
        total_sectors += bs_sectors;
767
    }
768

    
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

    
782
    /* Find driver and parse its options */
783
    drv = bdrv_find_format(out_fmt);
784
    if (!drv) {
785
        error("Unknown file format '%s'", out_fmt);
786
        ret = -1;
787
        goto out;
788
    }
789

    
790
    proto_drv = bdrv_find_protocol(out_filename);
791
    if (!proto_drv) {
792
        error("Unknown protocol '%s'", out_filename);
793
        ret = -1;
794
        goto out;
795
    }
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);
801

    
802
    if (options) {
803
        param = parse_option_parameters(options, create_options, param);
804
        if (param == NULL) {
805
            error("Invalid options for file format '%s'.", out_fmt);
806
            ret = -1;
807
            goto out;
808
        }
809
    } else {
810
        param = parse_option_parameters("", create_options, param);
811
    }
812

    
813
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
814
    ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
815
    if (ret < 0) {
816
        goto out;
817
    }
818

    
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

    
825
    /* Check if compression is supported */
826
    if (compress) {
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");
832
            ret = -1;
833
            goto out;
834
        }
835

    
836
        if (encryption && encryption->value.n) {
837
            error("Compression and encryption not supported at the same time");
838
            ret = -1;
839
            goto out;
840
        }
841
    }
842

    
843
    /* Create the new image */
844
    ret = bdrv_create(drv, out_filename, param);
845
    if (ret < 0) {
846
        if (ret == -ENOTSUP) {
847
            error("Formatting not supported for file format '%s'", out_fmt);
848
        } else if (ret == -EFBIG) {
849
            error("The image size is too large for file format '%s'", out_fmt);
850
        } else {
851
            error("%s: error while converting %s: %s", out_filename, out_fmt, strerror(-ret));
852
        }
853
        goto out;
854
    }
855

    
856
    out_bs = bdrv_new_open(out_filename, out_fmt,
857
        BDRV_O_FLAGS | BDRV_O_RDWR | BDRV_O_NO_FLUSH);
858
    if (!out_bs) {
859
        ret = -1;
860
        goto out;
861
    }
862

    
863
    bs_i = 0;
864
    bs_offset = 0;
865
    bdrv_get_geometry(bs[0], &bs_sectors);
866
    buf = qemu_malloc(IO_BUF_SIZE);
867

    
868
    if (compress) {
869
        ret = bdrv_get_info(out_bs, &bdi);
870
        if (ret < 0) {
871
            error("could not get block driver info");
872
            goto out;
873
        }
874
        cluster_size = bdi.cluster_size;
875
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
876
            error("invalid cluster size");
877
            ret = -1;
878
            goto out;
879
        }
880
        cluster_sectors = cluster_size >> 9;
881
        sector_num = 0;
882
        for(;;) {
883
            int64_t bs_num;
884
            int remainder;
885
            uint8_t *buf2;
886

    
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;
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;
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); */
910
                }
911
                assert (bs_num < bs_sectors);
912

    
913
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
914

    
915
                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
916
                if (ret < 0) {
917
                    error("error while reading");
918
                    goto out;
919
                }
920

    
921
                buf2 += nlow * 512;
922
                bs_num += nlow;
923

    
924
                remainder -= nlow;
925
            }
926
            assert (remainder == 0);
927

    
928
            if (n < cluster_sectors) {
929
                memset(buf + n * 512, 0, cluster_size - n * 512);
930
            }
931
            if (is_not_zero(buf, cluster_size)) {
932
                ret = bdrv_write_compressed(out_bs, sector_num, buf,
933
                                            cluster_sectors);
934
                if (ret != 0) {
935
                    error("error while compressing sector %" PRId64,
936
                          sector_num);
937
                    goto out;
938
                }
939
            }
940
            sector_num += n;
941
        }
942
        /* signal EOF to align */
943
        bdrv_write_compressed(out_bs, 0, NULL, 0);
944
    } else {
945
        int has_zero_init = bdrv_has_zero_init(out_bs);
946

    
947
        sector_num = 0; // total number of sectors converted so far
948
        for(;;) {
949
            nb_sectors = total_sectors - sector_num;
950
            if (nb_sectors <= 0) {
951
                break;
952
            }
953
            if (nb_sectors >= (IO_BUF_SIZE / 512)) {
954
                n = (IO_BUF_SIZE / 512);
955
            } else {
956
                n = nb_sectors;
957
            }
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);
964
                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
965
                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
966
                   sector_num, bs_i, bs_offset, bs_sectors); */
967
            }
968

    
969
            if (n > bs_offset + bs_sectors - sector_num) {
970
                n = bs_offset + bs_sectors - sector_num;
971
            }
972

    
973
            if (has_zero_init) {
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;
987
                }
988
            } else {
989
                n1 = n;
990
            }
991

    
992
            ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
993
            if (ret < 0) {
994
                error("error while reading");
995
                goto out;
996
            }
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) {
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,
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. */
1009
                if (!has_zero_init || out_baseimg ||
1010
                    is_allocated_sectors(buf1, n, &n1)) {
1011
                    ret = bdrv_write(out_bs, sector_num, buf1, n1);
1012
                    if (ret < 0) {
1013
                        error("error while writing");
1014
                        goto out;
1015
                    }
1016
                }
1017
                sector_num += n1;
1018
                n -= n1;
1019
                buf1 += n1 * 512;
1020
            }
1021
        }
1022
    }
1023
out:
1024
    free_option_parameters(create_options);
1025
    free_option_parameters(param);
1026
    qemu_free(buf);
1027
    if (out_bs) {
1028
        bdrv_delete(out_bs);
1029
    }
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
            }
1035
        }
1036
        qemu_free(bs);
1037
    }
1038
    if (ret) {
1039
        return 1;
1040
    }
1041
    return 0;
1042
}
1043

    
1044
#ifdef _WIN32
1045
static int64_t get_allocated_file_size(const char *filename)
1046
{
1047
    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
1048
    get_compressed_t get_compressed;
1049
    struct _stati64 st;
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

    
1060
    if (_stati64(filename, &st) < 0)
1061
        return -1;
1062
    return st.st_size;
1063
}
1064
#else
1065
static int64_t get_allocated_file_size(const char *filename)
1066
{
1067
    struct stat st;
1068
    if (stat(filename, &st) < 0)
1069
        return -1;
1070
    return (int64_t)st.st_blocks * 512;
1071
}
1072
#endif
1073

    
1074
static 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

    
1092
static int img_info(int argc, char **argv)
1093
{
1094
    int c;
1095
    const char *filename, *fmt;
1096
    BlockDriverState *bs;
1097
    char fmt_name[128], size_buf[128], dsize_buf[128];
1098
    uint64_t total_sectors;
1099
    int64_t allocated_size;
1100
    char backing_filename[1024];
1101
    char backing_filename2[1024];
1102
    BlockDriverInfo bdi;
1103

    
1104
    fmt = NULL;
1105
    for(;;) {
1106
        c = getopt(argc, argv, "f:h");
1107
        if (c == -1) {
1108
            break;
1109
        }
1110
        switch(c) {
1111
        case '?':
1112
        case 'h':
1113
            help();
1114
            break;
1115
        case 'f':
1116
            fmt = optarg;
1117
            break;
1118
        }
1119
    }
1120
    if (optind >= argc) {
1121
        help();
1122
    }
1123
    filename = argv[optind++];
1124

    
1125
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1126
    if (!bs) {
1127
        return 1;
1128
    }
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);
1132
    allocated_size = get_allocated_file_size(filename);
1133
    if (allocated_size < 0) {
1134
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1135
    } else {
1136
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1137
                                allocated_size);
1138
    }
1139
    printf("image: %s\n"
1140
           "file format: %s\n"
1141
           "virtual size: %s (%" PRId64 " bytes)\n"
1142
           "disk size: %s\n",
1143
           filename, fmt_name, size_buf,
1144
           (total_sectors * 512),
1145
           dsize_buf);
1146
    if (bdrv_is_encrypted(bs)) {
1147
        printf("encrypted: yes\n");
1148
    }
1149
    if (bdrv_get_info(bs, &bdi) >= 0) {
1150
        if (bdi.cluster_size != 0) {
1151
            printf("cluster_size: %d\n", bdi.cluster_size);
1152
        }
1153
    }
1154
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1155
    if (backing_filename[0] != '\0') {
1156
        path_combine(backing_filename2, sizeof(backing_filename2),
1157
                     filename, backing_filename);
1158
        printf("backing file: %s (actual path: %s)\n",
1159
               backing_filename,
1160
               backing_filename2);
1161
    }
1162
    dump_snapshots(bs);
1163
    bdrv_delete(bs);
1164
    return 0;
1165
}
1166

    
1167
#define SNAPSHOT_LIST   1
1168
#define SNAPSHOT_CREATE 2
1169
#define SNAPSHOT_APPLY  3
1170
#define SNAPSHOT_DELETE 4
1171

    
1172
static int img_snapshot(int argc, char **argv)
1173
{
1174
    BlockDriverState *bs;
1175
    QEMUSnapshotInfo sn;
1176
    char *filename, *snapshot_name = NULL;
1177
    int c, ret = 0, bdrv_oflags;
1178
    int action = 0;
1179
    qemu_timeval tv;
1180

    
1181
    bdrv_oflags = BDRV_O_RDWR;
1182
    /* Parse commandline parameters */
1183
    for(;;) {
1184
        c = getopt(argc, argv, "la:c:d:h");
1185
        if (c == -1) {
1186
            break;
1187
        }
1188
        switch(c) {
1189
        case '?':
1190
        case 'h':
1191
            help();
1192
            return 0;
1193
        case 'l':
1194
            if (action) {
1195
                help();
1196
                return 0;
1197
            }
1198
            action = SNAPSHOT_LIST;
1199
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1200
            break;
1201
        case 'a':
1202
            if (action) {
1203
                help();
1204
                return 0;
1205
            }
1206
            action = SNAPSHOT_APPLY;
1207
            snapshot_name = optarg;
1208
            break;
1209
        case 'c':
1210
            if (action) {
1211
                help();
1212
                return 0;
1213
            }
1214
            action = SNAPSHOT_CREATE;
1215
            snapshot_name = optarg;
1216
            break;
1217
        case 'd':
1218
            if (action) {
1219
                help();
1220
                return 0;
1221
            }
1222
            action = SNAPSHOT_DELETE;
1223
            snapshot_name = optarg;
1224
            break;
1225
        }
1226
    }
1227

    
1228
    if (optind >= argc) {
1229
        help();
1230
    }
1231
    filename = argv[optind++];
1232

    
1233
    /* Open the image */
1234
    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1235
    if (!bs) {
1236
        return 1;
1237
    }
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);
1254
        if (ret) {
1255
            error("Could not create snapshot '%s': %d (%s)",
1256
                snapshot_name, ret, strerror(-ret));
1257
        }
1258
        break;
1259

    
1260
    case SNAPSHOT_APPLY:
1261
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1262
        if (ret) {
1263
            error("Could not apply snapshot '%s': %d (%s)",
1264
                snapshot_name, ret, strerror(-ret));
1265
        }
1266
        break;
1267

    
1268
    case SNAPSHOT_DELETE:
1269
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1270
        if (ret) {
1271
            error("Could not delete snapshot '%s': %d (%s)",
1272
                snapshot_name, ret, strerror(-ret));
1273
        }
1274
        break;
1275
    }
1276

    
1277
    /* Cleanup */
1278
    bdrv_delete(bs);
1279
    if (ret) {
1280
        return 1;
1281
    }
1282
    return 0;
1283
}
1284

    
1285
static int img_rebase(int argc, char **argv)
1286
{
1287
    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1288
    BlockDriver *old_backing_drv, *new_backing_drv;
1289
    char *filename;
1290
    const char *fmt, *out_basefmt, *out_baseimg;
1291
    int c, flags, ret;
1292
    int unsafe = 0;
1293

    
1294
    /* Parse commandline parameters */
1295
    fmt = NULL;
1296
    out_baseimg = NULL;
1297
    out_basefmt = NULL;
1298

    
1299
    for(;;) {
1300
        c = getopt(argc, argv, "uhf:F:b:");
1301
        if (c == -1) {
1302
            break;
1303
        }
1304
        switch(c) {
1305
        case '?':
1306
        case 'h':
1307
            help();
1308
            return 0;
1309
        case 'f':
1310
            fmt = optarg;
1311
            break;
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

    
1324
    if ((optind >= argc) || !out_baseimg) {
1325
        help();
1326
    }
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
     */
1335
    flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1336
    bs = bdrv_new_open(filename, fmt, flags);
1337
    if (!bs) {
1338
        return 1;
1339
    }
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);
1349
            ret = -1;
1350
            goto out;
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);
1358
            ret = -1;
1359
            goto out;
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));
1373
        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1374
                        old_backing_drv);
1375
        if (ret) {
1376
            error("Could not open old backing file '%s'", backing_name);
1377
            goto out;
1378
        }
1379

    
1380
        bs_new_backing = bdrv_new("new_backing");
1381
        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS,
1382
                        new_backing_drv);
1383
        if (ret) {
1384
            error("Could not open new backing file '%s'", out_baseimg);
1385
            goto out;
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;
1401
        int n;
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);
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 */
1420
            ret = bdrv_is_allocated(bs, sector, n, &n);
1421
            if (ret) {
1422
                continue;
1423
            }
1424

    
1425
            /* Read old and new backing file */
1426
            ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1427
            if (ret < 0) {
1428
                error("error while reading from old backing file");
1429
                goto out;
1430
            }
1431
            ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1432
            if (ret < 0) {
1433
                error("error while reading from new backing file");
1434
                goto out;
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,
1444
                    buf_new + written * 512, n - written, &pnum))
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));
1451
                        goto out;
1452
                    }
1453
                }
1454

    
1455
                written += pnum;
1456
            }
1457
        }
1458

    
1459
        qemu_free(buf_old);
1460
        qemu_free(buf_new);
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
     */
1483
out:
1484
    /* Cleanup */
1485
    if (!unsafe) {
1486
        bdrv_delete(bs_old_backing);
1487
        bdrv_delete(bs_new_backing);
1488
    }
1489

    
1490
    bdrv_delete(bs);
1491
    if (ret) {
1492
        return 1;
1493
    }
1494
    return 0;
1495
}
1496

    
1497
static 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;
1502
    BlockDriverState *bs = NULL;
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) {
1520
        case '?':
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 */
1554
        ret = -1;
1555
        goto out;
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);
1561
    if (!bs) {
1562
        ret = -1;
1563
        goto out;
1564
    }
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");
1573
        ret = -1;
1574
        goto out;
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
    }
1592
out:
1593
    if (bs) {
1594
        bdrv_delete(bs);
1595
    }
1596
    if (ret) {
1597
        return 1;
1598
    }
1599
    return 0;
1600
}
1601

    
1602
static const img_cmd_t img_cmds[] = {
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

    
1611
int main(int argc, char **argv)
1612
{
1613
    const img_cmd_t *cmd;
1614
    const char *cmdname;
1615

    
1616
    error_set_progname(argv[0]);
1617

    
1618
    bdrv_init();
1619
    if (argc < 2)
1620
        help();
1621
    cmdname = argv[1];
1622
    argc--; argv++;
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
        }
1629
    }
1630

    
1631
    /* not found */
1632
    help();
1633
    return 0;
1634
}