Statistics
| Branch: | Revision:

root / qemu-img.c @ 3f020d70

History | View | Annotate | Download (36.5 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 "osdep.h"
27
#include "block_int.h"
28
#include <stdio.h>
29

    
30
#ifdef _WIN32
31
#include <windows.h>
32
#endif
33

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

    
39
/* Default to cache=writeback as data integrity is not important for qemu-tcg. */
40
#define BRDV_O_FLAGS BDRV_O_CACHE_WB
41

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

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

    
58
/* Please keep in synch with qemu-img.texi */
59
static void help(void)
60
{
61
    printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2008 Fabrice Bellard\n"
62
           "usage: qemu-img command [command options]\n"
63
           "QEMU disk image utility\n"
64
           "\n"
65
           "Command syntax:\n"
66
#define DEF(option, callback, arg_string)        \
67
           "  " arg_string "\n"
68
#include "qemu-img-cmds.h"
69
#undef DEF
70
#undef GEN_DOCS
71
           "\n"
72
           "Command parameters:\n"
73
           "  'filename' is a disk image filename\n"
74
           "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
75
           "  'size' is the disk image size in bytes. Optional suffixes\n"
76
           "    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n"
77
           "    and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
78
           "  'output_filename' is the destination disk image filename\n"
79
           "  'output_fmt' is the destination format\n"
80
           "  'options' is a comma separated list of format specific options in a\n"
81
           "    name=value format. Use -o ? for an overview of the options supported by the\n"
82
           "    used format\n"
83
           "  '-c' indicates that target image must be compressed (qcow format only)\n"
84
           "  '-u' enables unsafe rebasing. It is assumed that old and new backing file\n"
85
           "       match exactly. The image doesn't need a working backing file before\n"
86
           "       rebasing in this case (useful for renaming the backing file)\n"
87
           "  '-h' with or without a command shows this help and lists the supported formats\n"
88
           "\n"
89
           "Parameters to snapshot subcommand:\n"
90
           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
91
           "  '-a' applies a snapshot (revert disk to saved state)\n"
92
           "  '-c' creates a snapshot\n"
93
           "  '-d' deletes a snapshot\n"
94
           "  '-l' lists all snapshots in the given image\n"
95
           );
96
    printf("\nSupported formats:");
97
    bdrv_iterate_format(format_print, NULL);
98
    printf("\n");
99
    exit(1);
100
}
101

    
102
#if defined(WIN32)
103
/* XXX: put correct support for win32 */
104
static int read_password(char *buf, int buf_size)
105
{
106
    int c, i;
107
    printf("Password: ");
108
    fflush(stdout);
109
    i = 0;
110
    for(;;) {
111
        c = getchar();
112
        if (c == '\n')
113
            break;
114
        if (i < (buf_size - 1))
115
            buf[i++] = c;
116
    }
117
    buf[i] = '\0';
118
    return 0;
119
}
120

    
121
#else
122

    
123
#include <termios.h>
124

    
125
static struct termios oldtty;
126

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

    
132
static void term_init(void)
133
{
134
    struct termios tty;
135

    
136
    tcgetattr (0, &tty);
137
    oldtty = tty;
138

    
139
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
140
                          |INLCR|IGNCR|ICRNL|IXON);
141
    tty.c_oflag |= OPOST;
142
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
143
    tty.c_cflag &= ~(CSIZE|PARENB);
144
    tty.c_cflag |= CS8;
145
    tty.c_cc[VMIN] = 1;
146
    tty.c_cc[VTIME] = 0;
147

    
148
    tcsetattr (0, TCSANOW, &tty);
149

    
150
    atexit(term_exit);
151
}
152

    
153
static int read_password(char *buf, int buf_size)
154
{
155
    uint8_t ch;
156
    int i, ret;
157

    
158
    printf("password: ");
159
    fflush(stdout);
160
    term_init();
161
    i = 0;
162
    for(;;) {
163
        ret = read(0, &ch, 1);
164
        if (ret == -1) {
165
            if (errno == EAGAIN || errno == EINTR) {
166
                continue;
167
            } else {
168
                ret = -1;
169
                break;
170
            }
171
        } else if (ret == 0) {
172
            ret = -1;
173
            break;
174
        } else {
175
            if (ch == '\r') {
176
                ret = 0;
177
                break;
178
            }
179
            if (i < (buf_size - 1))
180
                buf[i++] = ch;
181
        }
182
    }
183
    term_exit();
184
    buf[i] = '\0';
185
    printf("\n");
186
    return ret;
187
}
188
#endif
189

    
190
static BlockDriverState *bdrv_new_open(const char *filename,
191
                                       const char *fmt)
192
{
193
    BlockDriverState *bs;
194
    BlockDriver *drv;
195
    char password[256];
196

    
197
    bs = bdrv_new("");
198
    if (!bs)
199
        error("Not enough memory");
200
    if (fmt) {
201
        drv = bdrv_find_format(fmt);
202
        if (!drv)
203
            error("Unknown file format '%s'", fmt);
204
    } else {
205
        drv = NULL;
206
    }
207
    if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_RDWR, drv) < 0) {
208
        error("Could not open '%s'", filename);
209
    }
210
    if (bdrv_is_encrypted(bs)) {
211
        printf("Disk image '%s' is encrypted.\n", filename);
212
        if (read_password(password, sizeof(password)) < 0)
213
            error("No password given");
214
        if (bdrv_set_key(bs, password) < 0)
215
            error("invalid password");
216
    }
217
    return bs;
218
}
219

    
220
static void add_old_style_options(const char *fmt, QEMUOptionParameter *list,
221
    int flags, const char *base_filename, const char *base_fmt)
222
{
223
    if (flags & BLOCK_FLAG_ENCRYPT) {
224
        if (set_option_parameter(list, BLOCK_OPT_ENCRYPT, "on")) {
225
            error("Encryption not supported for file format '%s'", fmt);
226
        }
227
    }
228
    if (flags & BLOCK_FLAG_COMPAT6) {
229
        if (set_option_parameter(list, BLOCK_OPT_COMPAT6, "on")) {
230
            error("VMDK version 6 not supported for file format '%s'", fmt);
231
        }
232
    }
233

    
234
    if (base_filename) {
235
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
236
            error("Backing file not supported for file format '%s'", fmt);
237
        }
238
    }
239
    if (base_fmt) {
240
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
241
            error("Backing file format not supported for file format '%s'", fmt);
242
        }
243
    }
244
}
245

    
246
static int img_create(int argc, char **argv)
247
{
248
    int c, ret, flags;
249
    const char *fmt = "raw";
250
    const char *base_fmt = NULL;
251
    const char *filename;
252
    const char *base_filename = NULL;
253
    BlockDriver *drv;
254
    QEMUOptionParameter *param = NULL;
255
    char *options = NULL;
256

    
257
    flags = 0;
258
    for(;;) {
259
        c = getopt(argc, argv, "F:b:f:he6o:");
260
        if (c == -1)
261
            break;
262
        switch(c) {
263
        case 'h':
264
            help();
265
            break;
266
        case 'F':
267
            base_fmt = optarg;
268
            break;
269
        case 'b':
270
            base_filename = optarg;
271
            break;
272
        case 'f':
273
            fmt = optarg;
274
            break;
275
        case 'e':
276
            flags |= BLOCK_FLAG_ENCRYPT;
277
            break;
278
        case '6':
279
            flags |= BLOCK_FLAG_COMPAT6;
280
            break;
281
        case 'o':
282
            options = optarg;
283
            break;
284
        }
285
    }
286

    
287
    /* Find driver and parse its options */
288
    drv = bdrv_find_format(fmt);
289
    if (!drv)
290
        error("Unknown file format '%s'", fmt);
291

    
292
    if (options && !strcmp(options, "?")) {
293
        print_option_help(drv->create_options);
294
        return 0;
295
    }
296

    
297
    /* Create parameter list with default values */
298
    param = parse_option_parameters("", drv->create_options, param);
299
    set_option_parameter_int(param, BLOCK_OPT_SIZE, -1);
300

    
301
    /* Parse -o options */
302
    if (options) {
303
        param = parse_option_parameters(options, drv->create_options, param);
304
        if (param == NULL) {
305
            error("Invalid options for file format '%s'.", fmt);
306
        }
307
    }
308

    
309
    /* Get the filename */
310
    if (optind >= argc)
311
        help();
312
    filename = argv[optind++];
313

    
314
    /* Add size to parameters */
315
    if (optind < argc) {
316
        set_option_parameter(param, BLOCK_OPT_SIZE, argv[optind++]);
317
    }
318

    
319
    /* Add old-style options to parameters */
320
    add_old_style_options(fmt, param, flags, base_filename, base_fmt);
321

    
322
    // The size for the image must always be specified, with one exception:
323
    // If we are using a backing file, we can obtain the size from there
324
    if (get_option_parameter(param, BLOCK_OPT_SIZE)->value.n == -1) {
325

    
326
        QEMUOptionParameter *backing_file =
327
            get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
328
        QEMUOptionParameter *backing_fmt =
329
            get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
330

    
331
        if (backing_file && backing_file->value.s) {
332
            BlockDriverState *bs;
333
            uint64_t size;
334
            const char *fmt = NULL;
335
            char buf[32];
336

    
337
            if (backing_fmt && backing_fmt->value.s) {
338
                 if (bdrv_find_format(backing_fmt->value.s)) {
339
                     fmt = backing_fmt->value.s;
340
                } else {
341
                     error("Unknown backing file format '%s'",
342
                        backing_fmt->value.s);
343
                }
344
            }
345

    
346
            bs = bdrv_new_open(backing_file->value.s, fmt);
347
            bdrv_get_geometry(bs, &size);
348
            size *= 512;
349
            bdrv_delete(bs);
350

    
351
            snprintf(buf, sizeof(buf), "%" PRId64, size);
352
            set_option_parameter(param, BLOCK_OPT_SIZE, buf);
353
        } else {
354
            error("Image creation needs a size parameter");
355
        }
356
    }
357

    
358
    printf("Formatting '%s', fmt=%s ", filename, fmt);
359
    print_option_parameters(param);
360
    puts("");
361

    
362
    ret = bdrv_create(drv, filename, param);
363
    free_option_parameters(param);
364

    
365
    if (ret < 0) {
366
        if (ret == -ENOTSUP) {
367
            error("Formatting or formatting option not supported for file format '%s'", fmt);
368
        } else if (ret == -EFBIG) {
369
            error("The image size is too large for file format '%s'", fmt);
370
        } else {
371
            error("Error while formatting");
372
        }
373
    }
374
    return 0;
375
}
376

    
377
static int img_check(int argc, char **argv)
378
{
379
    int c, ret;
380
    const char *filename, *fmt;
381
    BlockDriver *drv;
382
    BlockDriverState *bs;
383

    
384
    fmt = NULL;
385
    for(;;) {
386
        c = getopt(argc, argv, "f:h");
387
        if (c == -1)
388
            break;
389
        switch(c) {
390
        case 'h':
391
            help();
392
            break;
393
        case 'f':
394
            fmt = optarg;
395
            break;
396
        }
397
    }
398
    if (optind >= argc)
399
        help();
400
    filename = argv[optind++];
401

    
402
    bs = bdrv_new("");
403
    if (!bs)
404
        error("Not enough memory");
405
    if (fmt) {
406
        drv = bdrv_find_format(fmt);
407
        if (!drv)
408
            error("Unknown file format '%s'", fmt);
409
    } else {
410
        drv = NULL;
411
    }
412
    if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
413
        error("Could not open '%s'", filename);
414
    }
415
    ret = bdrv_check(bs);
416
    switch(ret) {
417
    case 0:
418
        printf("No errors were found on the image.\n");
419
        break;
420
    case -ENOTSUP:
421
        error("This image format does not support checks");
422
        break;
423
    default:
424
        if (ret < 0) {
425
            error("An error occurred during the check");
426
        } else {
427
            printf("%d errors were found on the image.\n", ret);
428
        }
429
        break;
430
    }
431

    
432
    bdrv_delete(bs);
433
    return 0;
434
}
435

    
436
static int img_commit(int argc, char **argv)
437
{
438
    int c, ret;
439
    const char *filename, *fmt;
440
    BlockDriver *drv;
441
    BlockDriverState *bs;
442

    
443
    fmt = NULL;
444
    for(;;) {
445
        c = getopt(argc, argv, "f:h");
446
        if (c == -1)
447
            break;
448
        switch(c) {
449
        case 'h':
450
            help();
451
            break;
452
        case 'f':
453
            fmt = optarg;
454
            break;
455
        }
456
    }
457
    if (optind >= argc)
458
        help();
459
    filename = argv[optind++];
460

    
461
    bs = bdrv_new("");
462
    if (!bs)
463
        error("Not enough memory");
464
    if (fmt) {
465
        drv = bdrv_find_format(fmt);
466
        if (!drv)
467
            error("Unknown file format '%s'", fmt);
468
    } else {
469
        drv = NULL;
470
    }
471
    if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_RDWR, drv) < 0) {
472
        error("Could not open '%s'", filename);
473
    }
474
    ret = bdrv_commit(bs);
475
    switch(ret) {
476
    case 0:
477
        printf("Image committed.\n");
478
        break;
479
    case -ENOENT:
480
        error("No disk inserted");
481
        break;
482
    case -EACCES:
483
        error("Image is read-only");
484
        break;
485
    case -ENOTSUP:
486
        error("Image is already committed");
487
        break;
488
    default:
489
        error("Error while committing image");
490
        break;
491
    }
492

    
493
    bdrv_delete(bs);
494
    return 0;
495
}
496

    
497
static int is_not_zero(const uint8_t *sector, int len)
498
{
499
    int i;
500
    len >>= 2;
501
    for(i = 0;i < len; i++) {
502
        if (((uint32_t *)sector)[i] != 0)
503
            return 1;
504
    }
505
    return 0;
506
}
507

    
508
/*
509
 * Returns true iff the first sector pointed to by 'buf' contains at least
510
 * a non-NUL byte.
511
 *
512
 * 'pnum' is set to the number of sectors (including and immediately following
513
 * the first one) that are known to be in the same allocated/unallocated state.
514
 */
515
static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
516
{
517
    int v, i;
518

    
519
    if (n <= 0) {
520
        *pnum = 0;
521
        return 0;
522
    }
523
    v = is_not_zero(buf, 512);
524
    for(i = 1; i < n; i++) {
525
        buf += 512;
526
        if (v != is_not_zero(buf, 512))
527
            break;
528
    }
529
    *pnum = i;
530
    return v;
531
}
532

    
533
/*
534
 * Compares two buffers sector by sector. Returns 0 if the first sector of both
535
 * buffers matches, non-zero otherwise.
536
 *
537
 * pnum is set to the number of sectors (including and immediately following
538
 * the first one) that are known to have the same comparison result
539
 */
540
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
541
    int *pnum)
542
{
543
    int res, i;
544

    
545
    if (n <= 0) {
546
        *pnum = 0;
547
        return 0;
548
    }
549

    
550
    res = !!memcmp(buf1, buf2, 512);
551
    for(i = 1; i < n; i++) {
552
        buf1 += 512;
553
        buf2 += 512;
554

    
555
        if (!!memcmp(buf1, buf2, 512) != res) {
556
            break;
557
        }
558
    }
559

    
560
    *pnum = i;
561
    return res;
562
}
563

    
564
#define IO_BUF_SIZE (2 * 1024 * 1024)
565

    
566
static int img_convert(int argc, char **argv)
567
{
568
    int c, ret, n, n1, bs_n, bs_i, flags, cluster_size, cluster_sectors;
569
    const char *fmt, *out_fmt, *out_baseimg, *out_filename;
570
    BlockDriver *drv;
571
    BlockDriverState **bs, *out_bs;
572
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
573
    uint64_t bs_sectors;
574
    uint8_t buf[IO_BUF_SIZE];
575
    const uint8_t *buf1;
576
    BlockDriverInfo bdi;
577
    QEMUOptionParameter *param = NULL;
578
    char *options = NULL;
579

    
580
    fmt = NULL;
581
    out_fmt = "raw";
582
    out_baseimg = NULL;
583
    flags = 0;
584
    for(;;) {
585
        c = getopt(argc, argv, "f:O:B:hce6o:");
586
        if (c == -1)
587
            break;
588
        switch(c) {
589
        case 'h':
590
            help();
591
            break;
592
        case 'f':
593
            fmt = optarg;
594
            break;
595
        case 'O':
596
            out_fmt = optarg;
597
            break;
598
        case 'B':
599
            out_baseimg = optarg;
600
            break;
601
        case 'c':
602
            flags |= BLOCK_FLAG_COMPRESS;
603
            break;
604
        case 'e':
605
            flags |= BLOCK_FLAG_ENCRYPT;
606
            break;
607
        case '6':
608
            flags |= BLOCK_FLAG_COMPAT6;
609
            break;
610
        case 'o':
611
            options = optarg;
612
            break;
613
        }
614
    }
615

    
616
    bs_n = argc - optind - 1;
617
    if (bs_n < 1) help();
618

    
619
    out_filename = argv[argc - 1];
620

    
621
    if (bs_n > 1 && out_baseimg)
622
        error("-B makes no sense when concatenating multiple input images");
623
        
624
    bs = calloc(bs_n, sizeof(BlockDriverState *));
625
    if (!bs)
626
        error("Out of memory");
627

    
628
    total_sectors = 0;
629
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
630
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt);
631
        if (!bs[bs_i])
632
            error("Could not open '%s'", argv[optind + bs_i]);
633
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
634
        total_sectors += bs_sectors;
635
    }
636

    
637
    /* Find driver and parse its options */
638
    drv = bdrv_find_format(out_fmt);
639
    if (!drv)
640
        error("Unknown file format '%s'", out_fmt);
641

    
642
    if (options && !strcmp(options, "?")) {
643
        print_option_help(drv->create_options);
644
        free(bs);
645
        return 0;
646
    }
647

    
648
    if (options) {
649
        param = parse_option_parameters(options, drv->create_options, param);
650
        if (param == NULL) {
651
            error("Invalid options for file format '%s'.", out_fmt);
652
        }
653
    } else {
654
        param = parse_option_parameters("", drv->create_options, param);
655
    }
656

    
657
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
658
    add_old_style_options(out_fmt, param, flags, out_baseimg, NULL);
659

    
660
    /* Check if compression is supported */
661
    if (flags & BLOCK_FLAG_COMPRESS) {
662
        QEMUOptionParameter *encryption =
663
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
664

    
665
        if (!drv->bdrv_write_compressed) {
666
            error("Compression not supported for this file format");
667
        }
668

    
669
        if (encryption && encryption->value.n) {
670
            error("Compression and encryption not supported at the same time");
671
        }
672
    }
673

    
674
    /* Create the new image */
675
    ret = bdrv_create(drv, out_filename, param);
676
    free_option_parameters(param);
677

    
678
    if (ret < 0) {
679
        if (ret == -ENOTSUP) {
680
            error("Formatting not supported for file format '%s'", out_fmt);
681
        } else if (ret == -EFBIG) {
682
            error("The image size is too large for file format '%s'", out_fmt);
683
        } else {
684
            error("Error while formatting '%s'", out_filename);
685
        }
686
    }
687

    
688
    out_bs = bdrv_new_open(out_filename, out_fmt);
689

    
690
    bs_i = 0;
691
    bs_offset = 0;
692
    bdrv_get_geometry(bs[0], &bs_sectors);
693

    
694
    if (flags & BLOCK_FLAG_COMPRESS) {
695
        if (bdrv_get_info(out_bs, &bdi) < 0)
696
            error("could not get block driver info");
697
        cluster_size = bdi.cluster_size;
698
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE)
699
            error("invalid cluster size");
700
        cluster_sectors = cluster_size >> 9;
701
        sector_num = 0;
702
        for(;;) {
703
            int64_t bs_num;
704
            int remainder;
705
            uint8_t *buf2;
706

    
707
            nb_sectors = total_sectors - sector_num;
708
            if (nb_sectors <= 0)
709
                break;
710
            if (nb_sectors >= cluster_sectors)
711
                n = cluster_sectors;
712
            else
713
                n = nb_sectors;
714

    
715
            bs_num = sector_num - bs_offset;
716
            assert (bs_num >= 0);
717
            remainder = n;
718
            buf2 = buf;
719
            while (remainder > 0) {
720
                int nlow;
721
                while (bs_num == bs_sectors) {
722
                    bs_i++;
723
                    assert (bs_i < bs_n);
724
                    bs_offset += bs_sectors;
725
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
726
                    bs_num = 0;
727
                    /* printf("changing part: sector_num=%lld, "
728
                       "bs_i=%d, bs_offset=%lld, bs_sectors=%lld\n",
729
                       sector_num, bs_i, bs_offset, bs_sectors); */
730
                }
731
                assert (bs_num < bs_sectors);
732

    
733
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
734

    
735
                if (bdrv_read(bs[bs_i], bs_num, buf2, nlow) < 0) 
736
                    error("error while reading");
737

    
738
                buf2 += nlow * 512;
739
                bs_num += nlow;
740

    
741
                remainder -= nlow;
742
            }
743
            assert (remainder == 0);
744

    
745
            if (n < cluster_sectors)
746
                memset(buf + n * 512, 0, cluster_size - n * 512);
747
            if (is_not_zero(buf, cluster_size)) {
748
                if (bdrv_write_compressed(out_bs, sector_num, buf,
749
                                          cluster_sectors) != 0)
750
                    error("error while compressing sector %" PRId64,
751
                          sector_num);
752
            }
753
            sector_num += n;
754
        }
755
        /* signal EOF to align */
756
        bdrv_write_compressed(out_bs, 0, NULL, 0);
757
    } else {
758
        sector_num = 0; // total number of sectors converted so far
759
        for(;;) {
760
            nb_sectors = total_sectors - sector_num;
761
            if (nb_sectors <= 0)
762
                break;
763
            if (nb_sectors >= (IO_BUF_SIZE / 512))
764
                n = (IO_BUF_SIZE / 512);
765
            else
766
                n = nb_sectors;
767

    
768
            while (sector_num - bs_offset >= bs_sectors) {
769
                bs_i ++;
770
                assert (bs_i < bs_n);
771
                bs_offset += bs_sectors;
772
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
773
                /* printf("changing part: sector_num=%lld, bs_i=%d, "
774
                  "bs_offset=%lld, bs_sectors=%lld\n",
775
                   sector_num, bs_i, bs_offset, bs_sectors); */
776
            }
777

    
778
            if (n > bs_offset + bs_sectors - sector_num)
779
                n = bs_offset + bs_sectors - sector_num;
780

    
781
            if (!drv->no_zero_init) {
782
                /* If the output image is being created as a copy on write image,
783
                   assume that sectors which are unallocated in the input image
784
                   are present in both the output's and input's base images (no
785
                   need to copy them). */
786
                if (out_baseimg) {
787
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
788
                                           n, &n1)) {
789
                        sector_num += n1;
790
                        continue;
791
                    }
792
                    /* The next 'n1' sectors are allocated in the input image. Copy
793
                       only those as they may be followed by unallocated sectors. */
794
                    n = n1;
795
                }
796
            } else {
797
                n1 = n;
798
            }
799

    
800
            if (bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n) < 0) 
801
                error("error while reading");
802
            /* NOTE: at the same time we convert, we do not write zero
803
               sectors to have a chance to compress the image. Ideally, we
804
               should add a specific call to have the info to go faster */
805
            buf1 = buf;
806
            while (n > 0) {
807
                /* If the output image is being created as a copy on write image,
808
                   copy all sectors even the ones containing only NUL bytes,
809
                   because they may differ from the sectors in the base image.
810

811
                   If the output is to a host device, we also write out
812
                   sectors that are entirely 0, since whatever data was
813
                   already there is garbage, not 0s. */
814
                if (drv->no_zero_init || out_baseimg ||
815
                    is_allocated_sectors(buf1, n, &n1)) {
816
                    if (bdrv_write(out_bs, sector_num, buf1, n1) < 0)
817
                        error("error while writing");
818
                }
819
                sector_num += n1;
820
                n -= n1;
821
                buf1 += n1 * 512;
822
            }
823
        }
824
    }
825
    bdrv_delete(out_bs);
826
    for (bs_i = 0; bs_i < bs_n; bs_i++)
827
        bdrv_delete(bs[bs_i]);
828
    free(bs);
829
    return 0;
830
}
831

    
832
#ifdef _WIN32
833
static int64_t get_allocated_file_size(const char *filename)
834
{
835
    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
836
    get_compressed_t get_compressed;
837
    struct _stati64 st;
838

    
839
    /* WinNT support GetCompressedFileSize to determine allocate size */
840
    get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
841
    if (get_compressed) {
842
            DWORD high, low;
843
            low = get_compressed(filename, &high);
844
            if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
845
            return (((int64_t) high) << 32) + low;
846
    }
847

    
848
    if (_stati64(filename, &st) < 0)
849
        return -1;
850
    return st.st_size;
851
}
852
#else
853
static int64_t get_allocated_file_size(const char *filename)
854
{
855
    struct stat st;
856
    if (stat(filename, &st) < 0)
857
        return -1;
858
    return (int64_t)st.st_blocks * 512;
859
}
860
#endif
861

    
862
static void dump_snapshots(BlockDriverState *bs)
863
{
864
    QEMUSnapshotInfo *sn_tab, *sn;
865
    int nb_sns, i;
866
    char buf[256];
867

    
868
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
869
    if (nb_sns <= 0)
870
        return;
871
    printf("Snapshot list:\n");
872
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
873
    for(i = 0; i < nb_sns; i++) {
874
        sn = &sn_tab[i];
875
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
876
    }
877
    qemu_free(sn_tab);
878
}
879

    
880
static int img_info(int argc, char **argv)
881
{
882
    int c;
883
    const char *filename, *fmt;
884
    BlockDriver *drv;
885
    BlockDriverState *bs;
886
    char fmt_name[128], size_buf[128], dsize_buf[128];
887
    uint64_t total_sectors;
888
    int64_t allocated_size;
889
    char backing_filename[1024];
890
    char backing_filename2[1024];
891
    BlockDriverInfo bdi;
892

    
893
    fmt = NULL;
894
    for(;;) {
895
        c = getopt(argc, argv, "f:h");
896
        if (c == -1)
897
            break;
898
        switch(c) {
899
        case 'h':
900
            help();
901
            break;
902
        case 'f':
903
            fmt = optarg;
904
            break;
905
        }
906
    }
907
    if (optind >= argc)
908
        help();
909
    filename = argv[optind++];
910

    
911
    bs = bdrv_new("");
912
    if (!bs)
913
        error("Not enough memory");
914
    if (fmt) {
915
        drv = bdrv_find_format(fmt);
916
        if (!drv)
917
            error("Unknown file format '%s'", fmt);
918
    } else {
919
        drv = NULL;
920
    }
921
    if (bdrv_open2(bs, filename, BRDV_O_FLAGS | BDRV_O_NO_BACKING, drv) < 0) {
922
        error("Could not open '%s'", filename);
923
    }
924
    bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
925
    bdrv_get_geometry(bs, &total_sectors);
926
    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
927
    allocated_size = get_allocated_file_size(filename);
928
    if (allocated_size < 0)
929
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
930
    else
931
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
932
                                allocated_size);
933
    printf("image: %s\n"
934
           "file format: %s\n"
935
           "virtual size: %s (%" PRId64 " bytes)\n"
936
           "disk size: %s\n",
937
           filename, fmt_name, size_buf,
938
           (total_sectors * 512),
939
           dsize_buf);
940
    if (bdrv_is_encrypted(bs))
941
        printf("encrypted: yes\n");
942
    if (bdrv_get_info(bs, &bdi) >= 0) {
943
        if (bdi.cluster_size != 0)
944
            printf("cluster_size: %d\n", bdi.cluster_size);
945
    }
946
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
947
    if (backing_filename[0] != '\0') {
948
        path_combine(backing_filename2, sizeof(backing_filename2),
949
                     filename, backing_filename);
950
        printf("backing file: %s (actual path: %s)\n",
951
               backing_filename,
952
               backing_filename2);
953
    }
954
    dump_snapshots(bs);
955
    bdrv_delete(bs);
956
    return 0;
957
}
958

    
959
#define SNAPSHOT_LIST   1
960
#define SNAPSHOT_CREATE 2
961
#define SNAPSHOT_APPLY  3
962
#define SNAPSHOT_DELETE 4
963

    
964
static int img_snapshot(int argc, char **argv)
965
{
966
    BlockDriverState *bs;
967
    QEMUSnapshotInfo sn;
968
    char *filename, *snapshot_name = NULL;
969
    int c, ret, bdrv_oflags;
970
    int action = 0;
971
    qemu_timeval tv;
972

    
973
    bdrv_oflags = BDRV_O_RDWR;
974
    /* Parse commandline parameters */
975
    for(;;) {
976
        c = getopt(argc, argv, "la:c:d:h");
977
        if (c == -1)
978
            break;
979
        switch(c) {
980
        case 'h':
981
            help();
982
            return 0;
983
        case 'l':
984
            if (action) {
985
                help();
986
                return 0;
987
            }
988
            action = SNAPSHOT_LIST;
989
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
990
            break;
991
        case 'a':
992
            if (action) {
993
                help();
994
                return 0;
995
            }
996
            action = SNAPSHOT_APPLY;
997
            snapshot_name = optarg;
998
            break;
999
        case 'c':
1000
            if (action) {
1001
                help();
1002
                return 0;
1003
            }
1004
            action = SNAPSHOT_CREATE;
1005
            snapshot_name = optarg;
1006
            break;
1007
        case 'd':
1008
            if (action) {
1009
                help();
1010
                return 0;
1011
            }
1012
            action = SNAPSHOT_DELETE;
1013
            snapshot_name = optarg;
1014
            break;
1015
        }
1016
    }
1017

    
1018
    if (optind >= argc)
1019
        help();
1020
    filename = argv[optind++];
1021

    
1022
    /* Open the image */
1023
    bs = bdrv_new("");
1024
    if (!bs)
1025
        error("Not enough memory");
1026

    
1027
    if (bdrv_open2(bs, filename, bdrv_oflags, NULL) < 0) {
1028
        error("Could not open '%s'", filename);
1029
    }
1030

    
1031
    /* Perform the requested action */
1032
    switch(action) {
1033
    case SNAPSHOT_LIST:
1034
        dump_snapshots(bs);
1035
        break;
1036

    
1037
    case SNAPSHOT_CREATE:
1038
        memset(&sn, 0, sizeof(sn));
1039
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1040

    
1041
        qemu_gettimeofday(&tv);
1042
        sn.date_sec = tv.tv_sec;
1043
        sn.date_nsec = tv.tv_usec * 1000;
1044

    
1045
        ret = bdrv_snapshot_create(bs, &sn);
1046
        if (ret)
1047
            error("Could not create snapshot '%s': %d (%s)",
1048
                snapshot_name, ret, strerror(-ret));
1049
        break;
1050

    
1051
    case SNAPSHOT_APPLY:
1052
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1053
        if (ret)
1054
            error("Could not apply snapshot '%s': %d (%s)",
1055
                snapshot_name, ret, strerror(-ret));
1056
        break;
1057

    
1058
    case SNAPSHOT_DELETE:
1059
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1060
        if (ret)
1061
            error("Could not delete snapshot '%s': %d (%s)",
1062
                snapshot_name, ret, strerror(-ret));
1063
        break;
1064
    }
1065

    
1066
    /* Cleanup */
1067
    bdrv_delete(bs);
1068

    
1069
    return 0;
1070
}
1071

    
1072
static int img_rebase(int argc, char **argv)
1073
{
1074
    BlockDriverState *bs, *bs_old_backing, *bs_new_backing;
1075
    BlockDriver *old_backing_drv, *new_backing_drv;
1076
    char *filename;
1077
    const char *out_basefmt, *out_baseimg;
1078
    int c, flags, ret;
1079
    int unsafe = 0;
1080

    
1081
    /* Parse commandline parameters */
1082
    out_baseimg = NULL;
1083
    out_basefmt = NULL;
1084

    
1085
    for(;;) {
1086
        c = getopt(argc, argv, "uhF:b:");
1087
        if (c == -1)
1088
            break;
1089
        switch(c) {
1090
        case 'h':
1091
            help();
1092
            return 0;
1093
        case 'F':
1094
            out_basefmt = optarg;
1095
            break;
1096
        case 'b':
1097
            out_baseimg = optarg;
1098
            break;
1099
        case 'u':
1100
            unsafe = 1;
1101
            break;
1102
        }
1103
    }
1104

    
1105
    if ((optind >= argc) || !out_baseimg)
1106
        help();
1107
    filename = argv[optind++];
1108

    
1109
    /*
1110
     * Open the images.
1111
     *
1112
     * Ignore the old backing file for unsafe rebase in case we want to correct
1113
     * the reference to a renamed or moved backing file.
1114
     */
1115
    bs = bdrv_new("");
1116
    if (!bs)
1117
        error("Not enough memory");
1118

    
1119
    flags = BRDV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1120
    if (bdrv_open2(bs, filename, flags, NULL) < 0) {
1121
        error("Could not open '%s'", filename);
1122
    }
1123

    
1124
    /* Find the right drivers for the backing files */
1125
    old_backing_drv = NULL;
1126
    new_backing_drv = NULL;
1127

    
1128
    if (!unsafe && bs->backing_format[0] != '\0') {
1129
        old_backing_drv = bdrv_find_format(bs->backing_format);
1130
        if (old_backing_drv == NULL) {
1131
            error("Invalid format name: '%s'", bs->backing_format);
1132
        }
1133
    }
1134

    
1135
    if (out_basefmt != NULL) {
1136
        new_backing_drv = bdrv_find_format(out_basefmt);
1137
        if (new_backing_drv == NULL) {
1138
            error("Invalid format name: '%s'", out_basefmt);
1139
        }
1140
    }
1141

    
1142
    /* For safe rebasing we need to compare old and new backing file */
1143
    if (unsafe) {
1144
        /* Make the compiler happy */
1145
        bs_old_backing = NULL;
1146
        bs_new_backing = NULL;
1147
    } else {
1148
        char backing_name[1024];
1149

    
1150
        bs_old_backing = bdrv_new("old_backing");
1151
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1152
        if (bdrv_open2(bs_old_backing, backing_name, BRDV_O_FLAGS,
1153
            old_backing_drv))
1154
        {
1155
            error("Could not open old backing file '%s'", backing_name);
1156
            return -1;
1157
        }
1158

    
1159
        bs_new_backing = bdrv_new("new_backing");
1160
        if (bdrv_open2(bs_new_backing, out_baseimg, BRDV_O_FLAGS | BDRV_O_RDWR,
1161
            new_backing_drv))
1162
        {
1163
            error("Could not open new backing file '%s'", backing_name);
1164
            return -1;
1165
        }
1166
    }
1167

    
1168
    /*
1169
     * Check each unallocated cluster in the COW file. If it is unallocated,
1170
     * accesses go to the backing file. We must therefore compare this cluster
1171
     * in the old and new backing file, and if they differ we need to copy it
1172
     * from the old backing file into the COW file.
1173
     *
1174
     * If qemu-img crashes during this step, no harm is done. The content of
1175
     * the image is the same as the original one at any time.
1176
     */
1177
    if (!unsafe) {
1178
        uint64_t num_sectors;
1179
        uint64_t sector;
1180
        int n, n1;
1181
        uint8_t buf_old[IO_BUF_SIZE];
1182
        uint8_t buf_new[IO_BUF_SIZE];
1183

    
1184
        bdrv_get_geometry(bs, &num_sectors);
1185

    
1186
        for (sector = 0; sector < num_sectors; sector += n) {
1187

    
1188
            /* How many sectors can we handle with the next read? */
1189
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1190
                n = (IO_BUF_SIZE / 512);
1191
            } else {
1192
                n = num_sectors - sector;
1193
            }
1194

    
1195
            /* If the cluster is allocated, we don't need to take action */
1196
            if (bdrv_is_allocated(bs, sector, n, &n1)) {
1197
                n = n1;
1198
                continue;
1199
            }
1200

    
1201
            /* Read old and new backing file */
1202
            if (bdrv_read(bs_old_backing, sector, buf_old, n) < 0) {
1203
                error("error while reading from old backing file");
1204
            }
1205
            if (bdrv_read(bs_new_backing, sector, buf_new, n) < 0) {
1206
                error("error while reading from new backing file");
1207
            }
1208

    
1209
            /* If they differ, we need to write to the COW file */
1210
            uint64_t written = 0;
1211

    
1212
            while (written < n) {
1213
                int pnum;
1214

    
1215
                if (compare_sectors(buf_old + written * 512,
1216
                    buf_new + written * 512, n, &pnum))
1217
                {
1218
                    ret = bdrv_write(bs, sector + written,
1219
                        buf_old + written * 512, pnum);
1220
                    if (ret < 0) {
1221
                        error("Error while writing to COW image: %s",
1222
                            strerror(-ret));
1223
                    }
1224
                }
1225

    
1226
                written += pnum;
1227
            }
1228
        }
1229
    }
1230

    
1231
    /*
1232
     * Change the backing file. All clusters that are different from the old
1233
     * backing file are overwritten in the COW file now, so the visible content
1234
     * doesn't change when we switch the backing file.
1235
     */
1236
    ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1237
    if (ret == -ENOSPC) {
1238
        error("Could not change the backing file to '%s': No space left in "
1239
            "the file header", out_baseimg);
1240
    } else if (ret < 0) {
1241
        error("Could not change the backing file to '%s': %s",
1242
            out_baseimg, strerror(-ret));
1243
    }
1244

    
1245
    /*
1246
     * TODO At this point it is possible to check if any clusters that are
1247
     * allocated in the COW file are the same in the backing file. If so, they
1248
     * could be dropped from the COW file. Don't do this before switching the
1249
     * backing file, in case of a crash this would lead to corruption.
1250
     */
1251

    
1252
    /* Cleanup */
1253
    if (!unsafe) {
1254
        bdrv_delete(bs_old_backing);
1255
        bdrv_delete(bs_new_backing);
1256
    }
1257

    
1258
    bdrv_delete(bs);
1259

    
1260
    return 0;
1261
}
1262

    
1263
static const img_cmd_t img_cmds[] = {
1264
#define DEF(option, callback, arg_string)        \
1265
    { option, callback },
1266
#include "qemu-img-cmds.h"
1267
#undef DEF
1268
#undef GEN_DOCS
1269
    { NULL, NULL, },
1270
};
1271

    
1272
int main(int argc, char **argv)
1273
{
1274
    const img_cmd_t *cmd;
1275
    const char *cmdname;
1276

    
1277
    bdrv_init();
1278
    if (argc < 2)
1279
        help();
1280
    cmdname = argv[1];
1281
    argc--; argv++;
1282

    
1283
    /* find the command */
1284
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1285
        if (!strcmp(cmdname, cmd->name)) {
1286
            return cmd->handler(argc, argv);
1287
        }
1288
    }
1289

    
1290
    /* not found */
1291
    help();
1292
    return 0;
1293
}