Statistics
| Branch: | Revision:

root / qemu-img.c @ 9bc378c1

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

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

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

    
122
#else
123

    
124
#include <termios.h>
125

    
126
static struct termios oldtty;
127

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

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

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

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

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

    
151
    atexit(term_exit);
152
}
153

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

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

    
191
static BlockDriverState *bdrv_new_open(const char *filename,
192
                                       const char *fmt,
193
                                       int readonly)
194
{
195
    BlockDriverState *bs;
196
    BlockDriver *drv;
197
    char password[256];
198
    int flags = BRDV_O_FLAGS;
199

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

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

    
240
    if (base_filename) {
241
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
242
            error("Backing file not supported for file format '%s'", fmt);
243
        }
244
    }
245
    if (base_fmt) {
246
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
247
            error("Backing file format not supported for file format '%s'", fmt);
248
        }
249
    }
250
}
251

    
252
static int img_create(int argc, char **argv)
253
{
254
    int c, ret, flags;
255
    const char *fmt = "raw";
256
    const char *base_fmt = NULL;
257
    const char *filename;
258
    const char *base_filename = NULL;
259
    BlockDriver *drv;
260
    QEMUOptionParameter *param = NULL;
261
    char *options = NULL;
262

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

    
293
    /* Find driver and parse its options */
294
    drv = bdrv_find_format(fmt);
295
    if (!drv)
296
        error("Unknown file format '%s'", fmt);
297

    
298
    if (options && !strcmp(options, "?")) {
299
        print_option_help(drv->create_options);
300
        return 0;
301
    }
302

    
303
    /* Create parameter list with default values */
304
    param = parse_option_parameters("", drv->create_options, param);
305
    set_option_parameter_int(param, BLOCK_OPT_SIZE, -1);
306

    
307
    /* Parse -o options */
308
    if (options) {
309
        param = parse_option_parameters(options, drv->create_options, param);
310
        if (param == NULL) {
311
            error("Invalid options for file format '%s'.", fmt);
312
        }
313
    }
314

    
315
    /* Get the filename */
316
    if (optind >= argc)
317
        help();
318
    filename = argv[optind++];
319

    
320
    /* Add size to parameters */
321
    if (optind < argc) {
322
        set_option_parameter(param, BLOCK_OPT_SIZE, argv[optind++]);
323
    }
324

    
325
    /* Add old-style options to parameters */
326
    add_old_style_options(fmt, param, flags, base_filename, base_fmt);
327

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

    
332
        QEMUOptionParameter *backing_file =
333
            get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
334
        QEMUOptionParameter *backing_fmt =
335
            get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
336

    
337
        if (backing_file && backing_file->value.s) {
338
            BlockDriverState *bs;
339
            uint64_t size;
340
            const char *fmt = NULL;
341
            char buf[32];
342

    
343
            if (backing_fmt && backing_fmt->value.s) {
344
                 if (bdrv_find_format(backing_fmt->value.s)) {
345
                     fmt = backing_fmt->value.s;
346
                } else {
347
                     error("Unknown backing file format '%s'",
348
                        backing_fmt->value.s);
349
                }
350
            }
351

    
352
            bs = bdrv_new_open(backing_file->value.s, fmt, 1);
353
            bdrv_get_geometry(bs, &size);
354
            size *= 512;
355
            bdrv_delete(bs);
356

    
357
            snprintf(buf, sizeof(buf), "%" PRId64, size);
358
            set_option_parameter(param, BLOCK_OPT_SIZE, buf);
359
        } else {
360
            error("Image creation needs a size parameter");
361
        }
362
    }
363

    
364
    printf("Formatting '%s', fmt=%s ", filename, fmt);
365
    print_option_parameters(param);
366
    puts("");
367

    
368
    ret = bdrv_create(drv, filename, param);
369
    free_option_parameters(param);
370

    
371
    if (ret < 0) {
372
        if (ret == -ENOTSUP) {
373
            error("Formatting or formatting option not supported for file format '%s'", fmt);
374
        } else if (ret == -EFBIG) {
375
            error("The image size is too large for file format '%s'", fmt);
376
        } else {
377
            error("Error while formatting");
378
        }
379
    }
380
    return 0;
381
}
382

    
383
static int img_check(int argc, char **argv)
384
{
385
    int c, ret;
386
    const char *filename, *fmt;
387
    BlockDriver *drv;
388
    BlockDriverState *bs;
389

    
390
    fmt = NULL;
391
    for(;;) {
392
        c = getopt(argc, argv, "f:h");
393
        if (c == -1)
394
            break;
395
        switch(c) {
396
        case 'h':
397
            help();
398
            break;
399
        case 'f':
400
            fmt = optarg;
401
            break;
402
        }
403
    }
404
    if (optind >= argc)
405
        help();
406
    filename = argv[optind++];
407

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

    
438
    bdrv_delete(bs);
439
    return 0;
440
}
441

    
442
static int img_commit(int argc, char **argv)
443
{
444
    int c, ret;
445
    const char *filename, *fmt;
446
    BlockDriver *drv;
447
    BlockDriverState *bs;
448

    
449
    fmt = NULL;
450
    for(;;) {
451
        c = getopt(argc, argv, "f:h");
452
        if (c == -1)
453
            break;
454
        switch(c) {
455
        case 'h':
456
            help();
457
            break;
458
        case 'f':
459
            fmt = optarg;
460
            break;
461
        }
462
    }
463
    if (optind >= argc)
464
        help();
465
    filename = argv[optind++];
466

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

    
499
    bdrv_delete(bs);
500
    return 0;
501
}
502

    
503
static int is_not_zero(const uint8_t *sector, int len)
504
{
505
    int i;
506
    len >>= 2;
507
    for(i = 0;i < len; i++) {
508
        if (((uint32_t *)sector)[i] != 0)
509
            return 1;
510
    }
511
    return 0;
512
}
513

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

    
525
    if (n <= 0) {
526
        *pnum = 0;
527
        return 0;
528
    }
529
    v = is_not_zero(buf, 512);
530
    for(i = 1; i < n; i++) {
531
        buf += 512;
532
        if (v != is_not_zero(buf, 512))
533
            break;
534
    }
535
    *pnum = i;
536
    return v;
537
}
538

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

    
551
    if (n <= 0) {
552
        *pnum = 0;
553
        return 0;
554
    }
555

    
556
    res = !!memcmp(buf1, buf2, 512);
557
    for(i = 1; i < n; i++) {
558
        buf1 += 512;
559
        buf2 += 512;
560

    
561
        if (!!memcmp(buf1, buf2, 512) != res) {
562
            break;
563
        }
564
    }
565

    
566
    *pnum = i;
567
    return res;
568
}
569

    
570
#define IO_BUF_SIZE (2 * 1024 * 1024)
571

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

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

    
622
    bs_n = argc - optind - 1;
623
    if (bs_n < 1) help();
624

    
625
    out_filename = argv[argc - 1];
626

    
627
    if (bs_n > 1 && out_baseimg)
628
        error("-B makes no sense when concatenating multiple input images");
629
        
630
    bs = calloc(bs_n, sizeof(BlockDriverState *));
631
    if (!bs)
632
        error("Out of memory");
633

    
634
    total_sectors = 0;
635
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
636
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, 1);
637
        if (!bs[bs_i])
638
            error("Could not open '%s'", argv[optind + bs_i]);
639
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
640
        total_sectors += bs_sectors;
641
    }
642

    
643
    /* Find driver and parse its options */
644
    drv = bdrv_find_format(out_fmt);
645
    if (!drv)
646
        error("Unknown file format '%s'", out_fmt);
647

    
648
    if (options && !strcmp(options, "?")) {
649
        print_option_help(drv->create_options);
650
        free(bs);
651
        return 0;
652
    }
653

    
654
    if (options) {
655
        param = parse_option_parameters(options, drv->create_options, param);
656
        if (param == NULL) {
657
            error("Invalid options for file format '%s'.", out_fmt);
658
        }
659
    } else {
660
        param = parse_option_parameters("", drv->create_options, param);
661
    }
662

    
663
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
664
    add_old_style_options(out_fmt, param, flags, out_baseimg, NULL);
665

    
666
    /* Check if compression is supported */
667
    if (flags & BLOCK_FLAG_COMPRESS) {
668
        QEMUOptionParameter *encryption =
669
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
670

    
671
        if (!drv->bdrv_write_compressed) {
672
            error("Compression not supported for this file format");
673
        }
674

    
675
        if (encryption && encryption->value.n) {
676
            error("Compression and encryption not supported at the same time");
677
        }
678
    }
679

    
680
    /* Create the new image */
681
    ret = bdrv_create(drv, out_filename, param);
682
    free_option_parameters(param);
683

    
684
    if (ret < 0) {
685
        if (ret == -ENOTSUP) {
686
            error("Formatting not supported for file format '%s'", out_fmt);
687
        } else if (ret == -EFBIG) {
688
            error("The image size is too large for file format '%s'", out_fmt);
689
        } else {
690
            error("Error while formatting '%s'", out_filename);
691
        }
692
    }
693

    
694
    out_bs = bdrv_new_open(out_filename, out_fmt, 0);
695

    
696
    bs_i = 0;
697
    bs_offset = 0;
698
    bdrv_get_geometry(bs[0], &bs_sectors);
699

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

    
713
            nb_sectors = total_sectors - sector_num;
714
            if (nb_sectors <= 0)
715
                break;
716
            if (nb_sectors >= cluster_sectors)
717
                n = cluster_sectors;
718
            else
719
                n = nb_sectors;
720

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

    
739
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
740

    
741
                if (bdrv_read(bs[bs_i], bs_num, buf2, nlow) < 0) 
742
                    error("error while reading");
743

    
744
                buf2 += nlow * 512;
745
                bs_num += nlow;
746

    
747
                remainder -= nlow;
748
            }
749
            assert (remainder == 0);
750

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

    
774
            while (sector_num - bs_offset >= bs_sectors) {
775
                bs_i ++;
776
                assert (bs_i < bs_n);
777
                bs_offset += bs_sectors;
778
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
779
                /* printf("changing part: sector_num=%lld, bs_i=%d, "
780
                  "bs_offset=%lld, bs_sectors=%lld\n",
781
                   sector_num, bs_i, bs_offset, bs_sectors); */
782
            }
783

    
784
            if (n > bs_offset + bs_sectors - sector_num)
785
                n = bs_offset + bs_sectors - sector_num;
786

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

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

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

    
838
#ifdef _WIN32
839
static int64_t get_allocated_file_size(const char *filename)
840
{
841
    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
842
    get_compressed_t get_compressed;
843
    struct _stati64 st;
844

    
845
    /* WinNT support GetCompressedFileSize to determine allocate size */
846
    get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
847
    if (get_compressed) {
848
            DWORD high, low;
849
            low = get_compressed(filename, &high);
850
            if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
851
            return (((int64_t) high) << 32) + low;
852
    }
853

    
854
    if (_stati64(filename, &st) < 0)
855
        return -1;
856
    return st.st_size;
857
}
858
#else
859
static int64_t get_allocated_file_size(const char *filename)
860
{
861
    struct stat st;
862
    if (stat(filename, &st) < 0)
863
        return -1;
864
    return (int64_t)st.st_blocks * 512;
865
}
866
#endif
867

    
868
static void dump_snapshots(BlockDriverState *bs)
869
{
870
    QEMUSnapshotInfo *sn_tab, *sn;
871
    int nb_sns, i;
872
    char buf[256];
873

    
874
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
875
    if (nb_sns <= 0)
876
        return;
877
    printf("Snapshot list:\n");
878
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
879
    for(i = 0; i < nb_sns; i++) {
880
        sn = &sn_tab[i];
881
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
882
    }
883
    qemu_free(sn_tab);
884
}
885

    
886
static int img_info(int argc, char **argv)
887
{
888
    int c;
889
    const char *filename, *fmt;
890
    BlockDriver *drv;
891
    BlockDriverState *bs;
892
    char fmt_name[128], size_buf[128], dsize_buf[128];
893
    uint64_t total_sectors;
894
    int64_t allocated_size;
895
    char backing_filename[1024];
896
    char backing_filename2[1024];
897
    BlockDriverInfo bdi;
898

    
899
    fmt = NULL;
900
    for(;;) {
901
        c = getopt(argc, argv, "f:h");
902
        if (c == -1)
903
            break;
904
        switch(c) {
905
        case 'h':
906
            help();
907
            break;
908
        case 'f':
909
            fmt = optarg;
910
            break;
911
        }
912
    }
913
    if (optind >= argc)
914
        help();
915
    filename = argv[optind++];
916

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

    
965
#define SNAPSHOT_LIST   1
966
#define SNAPSHOT_CREATE 2
967
#define SNAPSHOT_APPLY  3
968
#define SNAPSHOT_DELETE 4
969

    
970
static int img_snapshot(int argc, char **argv)
971
{
972
    BlockDriverState *bs;
973
    QEMUSnapshotInfo sn;
974
    char *filename, *snapshot_name = NULL;
975
    int c, ret, bdrv_oflags;
976
    int action = 0;
977
    qemu_timeval tv;
978

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

    
1024
    if (optind >= argc)
1025
        help();
1026
    filename = argv[optind++];
1027

    
1028
    /* Open the image */
1029
    bs = bdrv_new("");
1030
    if (!bs)
1031
        error("Not enough memory");
1032

    
1033
    if (bdrv_open2(bs, filename, bdrv_oflags, NULL) < 0) {
1034
        error("Could not open '%s'", filename);
1035
    }
1036

    
1037
    /* Perform the requested action */
1038
    switch(action) {
1039
    case SNAPSHOT_LIST:
1040
        dump_snapshots(bs);
1041
        break;
1042

    
1043
    case SNAPSHOT_CREATE:
1044
        memset(&sn, 0, sizeof(sn));
1045
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1046

    
1047
        qemu_gettimeofday(&tv);
1048
        sn.date_sec = tv.tv_sec;
1049
        sn.date_nsec = tv.tv_usec * 1000;
1050

    
1051
        ret = bdrv_snapshot_create(bs, &sn);
1052
        if (ret)
1053
            error("Could not create snapshot '%s': %d (%s)",
1054
                snapshot_name, ret, strerror(-ret));
1055
        break;
1056

    
1057
    case SNAPSHOT_APPLY:
1058
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1059
        if (ret)
1060
            error("Could not apply snapshot '%s': %d (%s)",
1061
                snapshot_name, ret, strerror(-ret));
1062
        break;
1063

    
1064
    case SNAPSHOT_DELETE:
1065
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1066
        if (ret)
1067
            error("Could not delete snapshot '%s': %d (%s)",
1068
                snapshot_name, ret, strerror(-ret));
1069
        break;
1070
    }
1071

    
1072
    /* Cleanup */
1073
    bdrv_delete(bs);
1074

    
1075
    return 0;
1076
}
1077

    
1078
static int img_rebase(int argc, char **argv)
1079
{
1080
    BlockDriverState *bs, *bs_old_backing, *bs_new_backing;
1081
    BlockDriver *old_backing_drv, *new_backing_drv;
1082
    char *filename;
1083
    const char *out_basefmt, *out_baseimg;
1084
    int c, flags, ret;
1085
    int unsafe = 0;
1086

    
1087
    /* Parse commandline parameters */
1088
    out_baseimg = NULL;
1089
    out_basefmt = NULL;
1090

    
1091
    for(;;) {
1092
        c = getopt(argc, argv, "uhF:b:");
1093
        if (c == -1)
1094
            break;
1095
        switch(c) {
1096
        case 'h':
1097
            help();
1098
            return 0;
1099
        case 'F':
1100
            out_basefmt = optarg;
1101
            break;
1102
        case 'b':
1103
            out_baseimg = optarg;
1104
            break;
1105
        case 'u':
1106
            unsafe = 1;
1107
            break;
1108
        }
1109
    }
1110

    
1111
    if ((optind >= argc) || !out_baseimg)
1112
        help();
1113
    filename = argv[optind++];
1114

    
1115
    /*
1116
     * Open the images.
1117
     *
1118
     * Ignore the old backing file for unsafe rebase in case we want to correct
1119
     * the reference to a renamed or moved backing file.
1120
     */
1121
    bs = bdrv_new("");
1122
    if (!bs)
1123
        error("Not enough memory");
1124

    
1125
    flags = BRDV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1126
    if (bdrv_open2(bs, filename, flags, NULL) < 0) {
1127
        error("Could not open '%s'", filename);
1128
    }
1129

    
1130
    /* Find the right drivers for the backing files */
1131
    old_backing_drv = NULL;
1132
    new_backing_drv = NULL;
1133

    
1134
    if (!unsafe && bs->backing_format[0] != '\0') {
1135
        old_backing_drv = bdrv_find_format(bs->backing_format);
1136
        if (old_backing_drv == NULL) {
1137
            error("Invalid format name: '%s'", bs->backing_format);
1138
        }
1139
    }
1140

    
1141
    if (out_basefmt != NULL) {
1142
        new_backing_drv = bdrv_find_format(out_basefmt);
1143
        if (new_backing_drv == NULL) {
1144
            error("Invalid format name: '%s'", out_basefmt);
1145
        }
1146
    }
1147

    
1148
    /* For safe rebasing we need to compare old and new backing file */
1149
    if (unsafe) {
1150
        /* Make the compiler happy */
1151
        bs_old_backing = NULL;
1152
        bs_new_backing = NULL;
1153
    } else {
1154
        char backing_name[1024];
1155

    
1156
        bs_old_backing = bdrv_new("old_backing");
1157
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1158
        if (bdrv_open2(bs_old_backing, backing_name, BRDV_O_FLAGS,
1159
            old_backing_drv))
1160
        {
1161
            error("Could not open old backing file '%s'", backing_name);
1162
            return -1;
1163
        }
1164

    
1165
        bs_new_backing = bdrv_new("new_backing");
1166
        if (bdrv_open2(bs_new_backing, out_baseimg, BRDV_O_FLAGS | BDRV_O_RDWR,
1167
            new_backing_drv))
1168
        {
1169
            error("Could not open new backing file '%s'", backing_name);
1170
            return -1;
1171
        }
1172
    }
1173

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

    
1190
        bdrv_get_geometry(bs, &num_sectors);
1191

    
1192
        for (sector = 0; sector < num_sectors; sector += n) {
1193

    
1194
            /* How many sectors can we handle with the next read? */
1195
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1196
                n = (IO_BUF_SIZE / 512);
1197
            } else {
1198
                n = num_sectors - sector;
1199
            }
1200

    
1201
            /* If the cluster is allocated, we don't need to take action */
1202
            if (bdrv_is_allocated(bs, sector, n, &n1)) {
1203
                n = n1;
1204
                continue;
1205
            }
1206

    
1207
            /* Read old and new backing file */
1208
            if (bdrv_read(bs_old_backing, sector, buf_old, n) < 0) {
1209
                error("error while reading from old backing file");
1210
            }
1211
            if (bdrv_read(bs_new_backing, sector, buf_new, n) < 0) {
1212
                error("error while reading from new backing file");
1213
            }
1214

    
1215
            /* If they differ, we need to write to the COW file */
1216
            uint64_t written = 0;
1217

    
1218
            while (written < n) {
1219
                int pnum;
1220

    
1221
                if (compare_sectors(buf_old + written * 512,
1222
                    buf_new + written * 512, n, &pnum))
1223
                {
1224
                    ret = bdrv_write(bs, sector + written,
1225
                        buf_old + written * 512, pnum);
1226
                    if (ret < 0) {
1227
                        error("Error while writing to COW image: %s",
1228
                            strerror(-ret));
1229
                    }
1230
                }
1231

    
1232
                written += pnum;
1233
            }
1234
        }
1235
    }
1236

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

    
1251
    /*
1252
     * TODO At this point it is possible to check if any clusters that are
1253
     * allocated in the COW file are the same in the backing file. If so, they
1254
     * could be dropped from the COW file. Don't do this before switching the
1255
     * backing file, in case of a crash this would lead to corruption.
1256
     */
1257

    
1258
    /* Cleanup */
1259
    if (!unsafe) {
1260
        bdrv_delete(bs_old_backing);
1261
        bdrv_delete(bs_new_backing);
1262
    }
1263

    
1264
    bdrv_delete(bs);
1265

    
1266
    return 0;
1267
}
1268

    
1269
static const img_cmd_t img_cmds[] = {
1270
#define DEF(option, callback, arg_string)        \
1271
    { option, callback },
1272
#include "qemu-img-cmds.h"
1273
#undef DEF
1274
#undef GEN_DOCS
1275
    { NULL, NULL, },
1276
};
1277

    
1278
int main(int argc, char **argv)
1279
{
1280
    const img_cmd_t *cmd;
1281
    const char *cmdname;
1282

    
1283
    bdrv_init();
1284
    if (argc < 2)
1285
        help();
1286
    cmdname = argv[1];
1287
    argc--; argv++;
1288

    
1289
    /* find the command */
1290
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1291
        if (!strcmp(cmdname, cmd->name)) {
1292
            return cmd->handler(argc, argv);
1293
        }
1294
    }
1295

    
1296
    /* not found */
1297
    help();
1298
    return 0;
1299
}