Statistics
| Branch: | Revision:

root / qemu-img.c @ 283c7c63

History | View | Annotate | Download (30 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
           "  'base_image' is the read-only disk image which is used as base for a copy on\n"
75
           "    write image; the copy on write image only stores the modified data\n"
76
           "  'output_base_image' forces the output image to be created as a copy on write\n"
77
           "    image of the specified base image; 'output_base_image' should have the same\n"
78
           "    content as the input's base image, however the path, image format, etc may\n"
79
           "    differ\n"
80
           "  'fmt' is the disk image format. It is guessed automatically in most cases\n"
81
           "  'size' is the disk image size in kilobytes. Optional suffixes\n"
82
           "    'M' (megabyte, 1024 * 1024) and 'G' (gigabyte, 1024 * 1024 * 1024) are\n"
83
           "    supported any 'k' or 'K' is ignored\n"
84
           "  'output_filename' is the destination disk image filename\n"
85
           "  'output_fmt' is the destination format\n"
86
           "  'options' is a comma separated list of format specific options in a\n"
87
           "    name=value format. Use -o ? for an overview of the options supported by the\n"
88
           "    used format\n"
89
           "  '-c' indicates that target image must be compressed (qcow format only)\n"
90
           "  '-h' with or without a command shows this help and lists the supported formats\n"
91
           "\n"
92
           "Parameters to snapshot subcommand:\n"
93
           "  'snapshot' is the name of the snapshot to create, apply or delete\n"
94
           "  '-a' applies a snapshot (revert disk to saved state)\n"
95
           "  '-c' creates a snapshot\n"
96
           "  '-d' deletes a snapshot\n"
97
           "  '-l' lists all snapshots in the given image\n"
98
           );
99
    printf("\nSupported formats:");
100
    bdrv_iterate_format(format_print, NULL);
101
    printf("\n");
102
    exit(1);
103
}
104

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

    
124
#else
125

    
126
#include <termios.h>
127

    
128
static struct termios oldtty;
129

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

    
135
static void term_init(void)
136
{
137
    struct termios tty;
138

    
139
    tcgetattr (0, &tty);
140
    oldtty = tty;
141

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

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

    
153
    atexit(term_exit);
154
}
155

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

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

    
193
static BlockDriverState *bdrv_new_open(const char *filename,
194
                                       const char *fmt)
195
{
196
    BlockDriverState *bs;
197
    BlockDriver *drv;
198
    char password[256];
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 (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
211
        error("Could not open '%s'", filename);
212
    }
213
    if (bdrv_is_encrypted(bs)) {
214
        printf("Disk image '%s' is encrypted.\n", filename);
215
        if (read_password(password, sizeof(password)) < 0)
216
            error("No password given");
217
        if (bdrv_set_key(bs, password) < 0)
218
            error("invalid password");
219
    }
220
    return bs;
221
}
222

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

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

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

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

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

    
295
    if (options && !strcmp(options, "?")) {
296
        print_option_help(drv->create_options);
297
        return 0;
298
    }
299

    
300
    if (options) {
301
        param = parse_option_parameters(options, drv->create_options, param);
302
        if (param == NULL) {
303
            error("Invalid options for file format '%s'.", fmt);
304
        }
305
    } else {
306
        param = parse_option_parameters("", drv->create_options, param);
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 == 0) {
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, 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
#define IO_BUF_SIZE (2 * 1024 * 1024)
534

    
535
static int img_convert(int argc, char **argv)
536
{
537
    int c, ret, n, n1, bs_n, bs_i, flags, cluster_size, cluster_sectors;
538
    const char *fmt, *out_fmt, *out_baseimg, *out_filename;
539
    BlockDriver *drv;
540
    BlockDriverState **bs, *out_bs;
541
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
542
    uint64_t bs_sectors;
543
    uint8_t buf[IO_BUF_SIZE];
544
    const uint8_t *buf1;
545
    BlockDriverInfo bdi;
546
    QEMUOptionParameter *param = NULL;
547
    char *options = NULL;
548

    
549
    fmt = NULL;
550
    out_fmt = "raw";
551
    out_baseimg = NULL;
552
    flags = 0;
553
    for(;;) {
554
        c = getopt(argc, argv, "f:O:B:hce6o:");
555
        if (c == -1)
556
            break;
557
        switch(c) {
558
        case 'h':
559
            help();
560
            break;
561
        case 'f':
562
            fmt = optarg;
563
            break;
564
        case 'O':
565
            out_fmt = optarg;
566
            break;
567
        case 'B':
568
            out_baseimg = optarg;
569
            break;
570
        case 'c':
571
            flags |= BLOCK_FLAG_COMPRESS;
572
            break;
573
        case 'e':
574
            flags |= BLOCK_FLAG_ENCRYPT;
575
            break;
576
        case '6':
577
            flags |= BLOCK_FLAG_COMPAT6;
578
            break;
579
        case 'o':
580
            options = optarg;
581
            break;
582
        }
583
    }
584

    
585
    bs_n = argc - optind - 1;
586
    if (bs_n < 1) help();
587

    
588
    out_filename = argv[argc - 1];
589

    
590
    if (bs_n > 1 && out_baseimg)
591
        error("-B makes no sense when concatenating multiple input images");
592
        
593
    bs = calloc(bs_n, sizeof(BlockDriverState *));
594
    if (!bs)
595
        error("Out of memory");
596

    
597
    total_sectors = 0;
598
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
599
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt);
600
        if (!bs[bs_i])
601
            error("Could not open '%s'", argv[optind + bs_i]);
602
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
603
        total_sectors += bs_sectors;
604
    }
605

    
606
    /* Find driver and parse its options */
607
    drv = bdrv_find_format(out_fmt);
608
    if (!drv)
609
        error("Unknown file format '%s'", out_fmt);
610

    
611
    if (options && !strcmp(options, "?")) {
612
        print_option_help(drv->create_options);
613
        return 0;
614
    }
615

    
616
    if (options) {
617
        param = parse_option_parameters(options, drv->create_options, param);
618
        if (param == NULL) {
619
            error("Invalid options for file format '%s'.", out_fmt);
620
        }
621
    } else {
622
        param = parse_option_parameters("", drv->create_options, param);
623
    }
624

    
625
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
626
    add_old_style_options(out_fmt, param, flags, out_baseimg, NULL);
627

    
628
    /* Check if compression is supported */
629
    if (flags & BLOCK_FLAG_COMPRESS) {
630
        QEMUOptionParameter *encryption =
631
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
632

    
633
        if (!drv->bdrv_write_compressed) {
634
            error("Compression not supported for this file format");
635
        }
636

    
637
        if (encryption && encryption->value.n) {
638
            error("Compression and encryption not supported at the same time");
639
        }
640
    }
641

    
642
    /* Create the new image */
643
    ret = bdrv_create(drv, out_filename, param);
644
    free_option_parameters(param);
645

    
646
    if (ret < 0) {
647
        if (ret == -ENOTSUP) {
648
            error("Formatting not supported for file format '%s'", out_fmt);
649
        } else if (ret == -EFBIG) {
650
            error("The image size is too large for file format '%s'", out_fmt);
651
        } else {
652
            error("Error while formatting '%s'", out_filename);
653
        }
654
    }
655

    
656
    out_bs = bdrv_new_open(out_filename, out_fmt);
657

    
658
    bs_i = 0;
659
    bs_offset = 0;
660
    bdrv_get_geometry(bs[0], &bs_sectors);
661

    
662
    if (flags & BLOCK_FLAG_COMPRESS) {
663
        if (bdrv_get_info(out_bs, &bdi) < 0)
664
            error("could not get block driver info");
665
        cluster_size = bdi.cluster_size;
666
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE)
667
            error("invalid cluster size");
668
        cluster_sectors = cluster_size >> 9;
669
        sector_num = 0;
670
        for(;;) {
671
            int64_t bs_num;
672
            int remainder;
673
            uint8_t *buf2;
674

    
675
            nb_sectors = total_sectors - sector_num;
676
            if (nb_sectors <= 0)
677
                break;
678
            if (nb_sectors >= cluster_sectors)
679
                n = cluster_sectors;
680
            else
681
                n = nb_sectors;
682

    
683
            bs_num = sector_num - bs_offset;
684
            assert (bs_num >= 0);
685
            remainder = n;
686
            buf2 = buf;
687
            while (remainder > 0) {
688
                int nlow;
689
                while (bs_num == bs_sectors) {
690
                    bs_i++;
691
                    assert (bs_i < bs_n);
692
                    bs_offset += bs_sectors;
693
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
694
                    bs_num = 0;
695
                    /* printf("changing part: sector_num=%lld, "
696
                       "bs_i=%d, bs_offset=%lld, bs_sectors=%lld\n",
697
                       sector_num, bs_i, bs_offset, bs_sectors); */
698
                }
699
                assert (bs_num < bs_sectors);
700

    
701
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
702

    
703
                if (bdrv_read(bs[bs_i], bs_num, buf2, nlow) < 0) 
704
                    error("error while reading");
705

    
706
                buf2 += nlow * 512;
707
                bs_num += nlow;
708

    
709
                remainder -= nlow;
710
            }
711
            assert (remainder == 0);
712

    
713
            if (n < cluster_sectors)
714
                memset(buf + n * 512, 0, cluster_size - n * 512);
715
            if (is_not_zero(buf, cluster_size)) {
716
                if (bdrv_write_compressed(out_bs, sector_num, buf,
717
                                          cluster_sectors) != 0)
718
                    error("error while compressing sector %" PRId64,
719
                          sector_num);
720
            }
721
            sector_num += n;
722
        }
723
        /* signal EOF to align */
724
        bdrv_write_compressed(out_bs, 0, NULL, 0);
725
    } else {
726
        sector_num = 0; // total number of sectors converted so far
727
        for(;;) {
728
            nb_sectors = total_sectors - sector_num;
729
            if (nb_sectors <= 0)
730
                break;
731
            if (nb_sectors >= (IO_BUF_SIZE / 512))
732
                n = (IO_BUF_SIZE / 512);
733
            else
734
                n = nb_sectors;
735

    
736
            while (sector_num - bs_offset >= bs_sectors) {
737
                bs_i ++;
738
                assert (bs_i < bs_n);
739
                bs_offset += bs_sectors;
740
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
741
                /* printf("changing part: sector_num=%lld, bs_i=%d, "
742
                  "bs_offset=%lld, bs_sectors=%lld\n",
743
                   sector_num, bs_i, bs_offset, bs_sectors); */
744
            }
745

    
746
            if (n > bs_offset + bs_sectors - sector_num)
747
                n = bs_offset + bs_sectors - sector_num;
748

    
749
            if (strcmp(drv->format_name, "host_device")) {
750
                /* If the output image is being created as a copy on write image,
751
                   assume that sectors which are unallocated in the input image
752
                   are present in both the output's and input's base images (no
753
                   need to copy them). */
754
                if (out_baseimg) {
755
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
756
                                           n, &n1)) {
757
                        sector_num += n1;
758
                        continue;
759
                    }
760
                    /* The next 'n1' sectors are allocated in the input image. Copy
761
                       only those as they may be followed by unallocated sectors. */
762
                    n = n1;
763
                }
764
            } else {
765
                n1 = n;
766
            }
767

    
768
            if (bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n) < 0) 
769
                error("error while reading");
770
            /* NOTE: at the same time we convert, we do not write zero
771
               sectors to have a chance to compress the image. Ideally, we
772
               should add a specific call to have the info to go faster */
773
            buf1 = buf;
774
            while (n > 0) {
775
                /* If the output image is being created as a copy on write image,
776
                   copy all sectors even the ones containing only NUL bytes,
777
                   because they may differ from the sectors in the base image.
778

779
                   If the output is to a host device, we also write out
780
                   sectors that are entirely 0, since whatever data was
781
                   already there is garbage, not 0s. */
782
                if (strcmp(drv->format_name, "host_device") == 0 || out_baseimg ||
783
                    is_allocated_sectors(buf1, n, &n1)) {
784
                    if (bdrv_write(out_bs, sector_num, buf1, n1) < 0)
785
                        error("error while writing");
786
                }
787
                sector_num += n1;
788
                n -= n1;
789
                buf1 += n1 * 512;
790
            }
791
        }
792
    }
793
    bdrv_delete(out_bs);
794
    for (bs_i = 0; bs_i < bs_n; bs_i++)
795
        bdrv_delete(bs[bs_i]);
796
    free(bs);
797
    return 0;
798
}
799

    
800
#ifdef _WIN32
801
static int64_t get_allocated_file_size(const char *filename)
802
{
803
    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
804
    get_compressed_t get_compressed;
805
    struct _stati64 st;
806

    
807
    /* WinNT support GetCompressedFileSize to determine allocate size */
808
    get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
809
    if (get_compressed) {
810
            DWORD high, low;
811
            low = get_compressed(filename, &high);
812
            if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
813
            return (((int64_t) high) << 32) + low;
814
    }
815

    
816
    if (_stati64(filename, &st) < 0)
817
        return -1;
818
    return st.st_size;
819
}
820
#else
821
static int64_t get_allocated_file_size(const char *filename)
822
{
823
    struct stat st;
824
    if (stat(filename, &st) < 0)
825
        return -1;
826
    return (int64_t)st.st_blocks * 512;
827
}
828
#endif
829

    
830
static void dump_snapshots(BlockDriverState *bs)
831
{
832
    QEMUSnapshotInfo *sn_tab, *sn;
833
    int nb_sns, i;
834
    char buf[256];
835

    
836
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
837
    if (nb_sns <= 0)
838
        return;
839
    printf("Snapshot list:\n");
840
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
841
    for(i = 0; i < nb_sns; i++) {
842
        sn = &sn_tab[i];
843
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
844
    }
845
    qemu_free(sn_tab);
846
}
847

    
848
static int img_info(int argc, char **argv)
849
{
850
    int c;
851
    const char *filename, *fmt;
852
    BlockDriver *drv;
853
    BlockDriverState *bs;
854
    char fmt_name[128], size_buf[128], dsize_buf[128];
855
    uint64_t total_sectors;
856
    int64_t allocated_size;
857
    char backing_filename[1024];
858
    char backing_filename2[1024];
859
    BlockDriverInfo bdi;
860

    
861
    fmt = NULL;
862
    for(;;) {
863
        c = getopt(argc, argv, "f:h");
864
        if (c == -1)
865
            break;
866
        switch(c) {
867
        case 'h':
868
            help();
869
            break;
870
        case 'f':
871
            fmt = optarg;
872
            break;
873
        }
874
    }
875
    if (optind >= argc)
876
        help();
877
    filename = argv[optind++];
878

    
879
    bs = bdrv_new("");
880
    if (!bs)
881
        error("Not enough memory");
882
    if (fmt) {
883
        drv = bdrv_find_format(fmt);
884
        if (!drv)
885
            error("Unknown file format '%s'", fmt);
886
    } else {
887
        drv = NULL;
888
    }
889
    if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
890
        error("Could not open '%s'", filename);
891
    }
892
    bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
893
    bdrv_get_geometry(bs, &total_sectors);
894
    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
895
    allocated_size = get_allocated_file_size(filename);
896
    if (allocated_size < 0)
897
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
898
    else
899
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
900
                                allocated_size);
901
    printf("image: %s\n"
902
           "file format: %s\n"
903
           "virtual size: %s (%" PRId64 " bytes)\n"
904
           "disk size: %s\n",
905
           filename, fmt_name, size_buf,
906
           (total_sectors * 512),
907
           dsize_buf);
908
    if (bdrv_is_encrypted(bs))
909
        printf("encrypted: yes\n");
910
    if (bdrv_get_info(bs, &bdi) >= 0) {
911
        if (bdi.cluster_size != 0)
912
            printf("cluster_size: %d\n", bdi.cluster_size);
913
    }
914
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
915
    if (backing_filename[0] != '\0') {
916
        path_combine(backing_filename2, sizeof(backing_filename2),
917
                     filename, backing_filename);
918
        printf("backing file: %s (actual path: %s)\n",
919
               backing_filename,
920
               backing_filename2);
921
    }
922
    dump_snapshots(bs);
923
    bdrv_delete(bs);
924
    return 0;
925
}
926

    
927
#define SNAPSHOT_LIST   1
928
#define SNAPSHOT_CREATE 2
929
#define SNAPSHOT_APPLY  3
930
#define SNAPSHOT_DELETE 4
931

    
932
static int img_snapshot(int argc, char **argv)
933
{
934
    BlockDriverState *bs;
935
    QEMUSnapshotInfo sn;
936
    char *filename, *snapshot_name = NULL;
937
    int c, ret;
938
    int action = 0;
939
    qemu_timeval tv;
940

    
941
    /* Parse commandline parameters */
942
    for(;;) {
943
        c = getopt(argc, argv, "la:c:d:h");
944
        if (c == -1)
945
            break;
946
        switch(c) {
947
        case 'h':
948
            help();
949
            return 0;
950
        case 'l':
951
            if (action) {
952
                help();
953
                return 0;
954
            }
955
            action = SNAPSHOT_LIST;
956
            break;
957
        case 'a':
958
            if (action) {
959
                help();
960
                return 0;
961
            }
962
            action = SNAPSHOT_APPLY;
963
            snapshot_name = optarg;
964
            break;
965
        case 'c':
966
            if (action) {
967
                help();
968
                return 0;
969
            }
970
            action = SNAPSHOT_CREATE;
971
            snapshot_name = optarg;
972
            break;
973
        case 'd':
974
            if (action) {
975
                help();
976
                return 0;
977
            }
978
            action = SNAPSHOT_DELETE;
979
            snapshot_name = optarg;
980
            break;
981
        }
982
    }
983

    
984
    if (optind >= argc)
985
        help();
986
    filename = argv[optind++];
987

    
988
    /* Open the image */
989
    bs = bdrv_new("");
990
    if (!bs)
991
        error("Not enough memory");
992

    
993
    if (bdrv_open2(bs, filename, 0, NULL) < 0) {
994
        error("Could not open '%s'", filename);
995
    }
996

    
997
    /* Perform the requested action */
998
    switch(action) {
999
    case SNAPSHOT_LIST:
1000
        dump_snapshots(bs);
1001
        break;
1002

    
1003
    case SNAPSHOT_CREATE:
1004
        memset(&sn, 0, sizeof(sn));
1005
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1006

    
1007
        qemu_gettimeofday(&tv);
1008
        sn.date_sec = tv.tv_sec;
1009
        sn.date_nsec = tv.tv_usec * 1000;
1010

    
1011
        ret = bdrv_snapshot_create(bs, &sn);
1012
        if (ret)
1013
            error("Could not create snapshot '%s': %d (%s)",
1014
                snapshot_name, ret, strerror(-ret));
1015
        break;
1016

    
1017
    case SNAPSHOT_APPLY:
1018
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1019
        if (ret)
1020
            error("Could not apply snapshot '%s': %d (%s)",
1021
                snapshot_name, ret, strerror(-ret));
1022
        break;
1023

    
1024
    case SNAPSHOT_DELETE:
1025
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1026
        if (ret)
1027
            error("Could not delete snapshot '%s': %d (%s)",
1028
                snapshot_name, ret, strerror(-ret));
1029
        break;
1030
    }
1031

    
1032
    /* Cleanup */
1033
    bdrv_delete(bs);
1034

    
1035
    return 0;
1036
}
1037

    
1038
static const img_cmd_t img_cmds[] = {
1039
#define DEF(option, callback, arg_string)        \
1040
    { option, callback },
1041
#include "qemu-img-cmds.h"
1042
#undef DEF
1043
#undef GEN_DOCS
1044
    { NULL, NULL, },
1045
};
1046

    
1047
int main(int argc, char **argv)
1048
{
1049
    const img_cmd_t *cmd;
1050
    const char *cmdname;
1051

    
1052
    bdrv_init();
1053
    if (argc < 2)
1054
        help();
1055
    cmdname = argv[1];
1056
    argc--; argv++;
1057

    
1058
    /* find the command */
1059
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1060
        if (!strcmp(cmdname, cmd->name)) {
1061
            return cmd->handler(argc, argv);
1062
        }
1063
    }
1064

    
1065
    /* not found */
1066
    help();
1067
    return 0;
1068
}