Statistics
| Branch: | Revision:

root / qemu-img.c @ e076f338

History | View | Annotate | Download (42.2 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 BDRV_O_FLAGS BDRV_O_CACHE_WB
41

    
42
static void 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
    va_end(ap);
50
}
51

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

    
57
/* Please keep in synch with qemu-img.texi */
58
static void help(void)
59
{
60
    const char *help_msg =
61
           "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("%s\nSupported formats:", help_msg);
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
                                       int flags)
193
{
194
    BlockDriverState *bs;
195
    BlockDriver *drv;
196
    char password[256];
197

    
198
    bs = bdrv_new("");
199
    if (!bs) {
200
        error("Not enough memory");
201
        goto fail;
202
    }
203
    if (fmt) {
204
        drv = bdrv_find_format(fmt);
205
        if (!drv) {
206
            error("Unknown file format '%s'", fmt);
207
            goto fail;
208
        }
209
    } else {
210
        drv = NULL;
211
    }
212
    if (bdrv_open(bs, filename, flags, drv) < 0) {
213
        error("Could not open '%s'", filename);
214
        goto fail;
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
            goto fail;
221
        }
222
        if (bdrv_set_key(bs, password) < 0) {
223
            error("invalid password");
224
            goto fail;
225
        }
226
    }
227
    return bs;
228
fail:
229
    if (bs) {
230
        bdrv_delete(bs);
231
    }
232
    return NULL;
233
}
234

    
235
static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
236
    int flags, const char *base_filename, const char *base_fmt)
237
{
238
    if (flags & BLOCK_FLAG_ENCRYPT) {
239
        if (set_option_parameter(list, BLOCK_OPT_ENCRYPT, "on")) {
240
            error("Encryption not supported for file format '%s'", fmt);
241
            return -1;
242
        }
243
    }
244
    if (flags & BLOCK_FLAG_COMPAT6) {
245
        if (set_option_parameter(list, BLOCK_OPT_COMPAT6, "on")) {
246
            error("VMDK version 6 not supported for file format '%s'", fmt);
247
            return -1;
248
        }
249
    }
250

    
251
    if (base_filename) {
252
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
253
            error("Backing file not supported for file format '%s'", fmt);
254
            return -1;
255
        }
256
    }
257
    if (base_fmt) {
258
        if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
259
            error("Backing file format not supported for file format '%s'", fmt);
260
            return -1;
261
        }
262
    }
263
    return 0;
264
}
265

    
266
static int img_create(int argc, char **argv)
267
{
268
    int c, ret = 0, flags;
269
    const char *fmt = "raw";
270
    const char *base_fmt = NULL;
271
    const char *filename;
272
    const char *base_filename = NULL;
273
    BlockDriver *drv, *proto_drv;
274
    QEMUOptionParameter *param = NULL, *create_options = NULL;
275
    char *options = NULL;
276

    
277
    flags = 0;
278
    for(;;) {
279
        c = getopt(argc, argv, "F:b:f:he6o:");
280
        if (c == -1)
281
            break;
282
        switch(c) {
283
        case 'h':
284
            help();
285
            break;
286
        case 'F':
287
            base_fmt = optarg;
288
            break;
289
        case 'b':
290
            base_filename = optarg;
291
            break;
292
        case 'f':
293
            fmt = optarg;
294
            break;
295
        case 'e':
296
            flags |= BLOCK_FLAG_ENCRYPT;
297
            break;
298
        case '6':
299
            flags |= BLOCK_FLAG_COMPAT6;
300
            break;
301
        case 'o':
302
            options = optarg;
303
            break;
304
        }
305
    }
306

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

    
312
    /* Find driver and parse its options */
313
    drv = bdrv_find_format(fmt);
314
    if (!drv) {
315
        error("Unknown file format '%s'", fmt);
316
        return 1;
317
    }
318

    
319
    proto_drv = bdrv_find_protocol(filename);
320
    if (!proto_drv) {
321
        error("Unknown protocol '%s'", filename);
322
        return 1;
323
    }
324

    
325
    create_options = append_option_parameters(create_options,
326
                                              drv->create_options);
327
    create_options = append_option_parameters(create_options,
328
                                              proto_drv->create_options);
329

    
330
    if (options && !strcmp(options, "?")) {
331
        print_option_help(create_options);
332
        goto out;
333
    }
334

    
335
    /* Create parameter list with default values */
336
    param = parse_option_parameters("", create_options, param);
337
    set_option_parameter_int(param, BLOCK_OPT_SIZE, -1);
338

    
339
    /* Parse -o options */
340
    if (options) {
341
        param = parse_option_parameters(options, create_options, param);
342
        if (param == NULL) {
343
            error("Invalid options for file format '%s'.", fmt);
344
            ret = -1;
345
            goto out;
346
        }
347
    }
348

    
349
    /* Add size to parameters */
350
    if (optind < argc) {
351
        set_option_parameter(param, BLOCK_OPT_SIZE, argv[optind++]);
352
    }
353

    
354
    /* Add old-style options to parameters */
355
    ret = add_old_style_options(fmt, param, flags, base_filename, base_fmt);
356
    if (ret < 0) {
357
        goto out;
358
    }
359

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

    
364
        QEMUOptionParameter *backing_file =
365
            get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
366
        QEMUOptionParameter *backing_fmt =
367
            get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
368

    
369
        if (backing_file && backing_file->value.s) {
370
            BlockDriverState *bs;
371
            uint64_t size;
372
            const char *fmt = NULL;
373
            char buf[32];
374

    
375
            if (backing_fmt && backing_fmt->value.s) {
376
                 if (bdrv_find_format(backing_fmt->value.s)) {
377
                     fmt = backing_fmt->value.s;
378
                } else {
379
                     error("Unknown backing file format '%s'",
380
                        backing_fmt->value.s);
381
                     ret = -1;
382
                     goto out;
383
                }
384
            }
385

    
386
            bs = bdrv_new_open(backing_file->value.s, fmt, BDRV_O_FLAGS);
387
            if (!bs) {
388
                ret = -1;
389
                goto out;
390
            }
391
            bdrv_get_geometry(bs, &size);
392
            size *= 512;
393
            bdrv_delete(bs);
394

    
395
            snprintf(buf, sizeof(buf), "%" PRId64, size);
396
            set_option_parameter(param, BLOCK_OPT_SIZE, buf);
397
        } else {
398
            error("Image creation needs a size parameter");
399
            ret = -1;
400
            goto out;
401
        }
402
    }
403

    
404
    printf("Formatting '%s', fmt=%s ", filename, fmt);
405
    print_option_parameters(param);
406
    puts("");
407

    
408
    ret = bdrv_create(drv, filename, param);
409
    free_option_parameters(create_options);
410
    free_option_parameters(param);
411

    
412
    if (ret < 0) {
413
        if (ret == -ENOTSUP) {
414
            error("Formatting or formatting option not supported for file format '%s'", fmt);
415
        } else if (ret == -EFBIG) {
416
            error("The image size is too large for file format '%s'", fmt);
417
        } else {
418
            error("%s: error while creating %s: %s", filename, fmt, strerror(-ret));
419
        }
420
    }
421
out:
422
    if (ret) {
423
        return 1;
424
    }
425
    return 0;
426
}
427

    
428
/*
429
 * Checks an image for consistency. Exit codes:
430
 *
431
 * 0 - Check completed, image is good
432
 * 1 - Check not completed because of internal errors
433
 * 2 - Check completed, image is corrupted
434
 * 3 - Check completed, image has leaked clusters, but is good otherwise
435
 */
436
static int img_check(int argc, char **argv)
437
{
438
    int c, ret;
439
    const char *filename, *fmt;
440
    BlockDriverState *bs;
441
    BdrvCheckResult result;
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_open(filename, fmt, BDRV_O_FLAGS);
462
    if (!bs) {
463
        return 1;
464
    }
465
    ret = bdrv_check(bs, &result);
466

    
467
    if (ret == -ENOTSUP) {
468
        error("This image format does not support checks");
469
        bdrv_delete(bs);
470
        return 1;
471
    }
472

    
473
    if (!(result.corruptions || result.leaks || result.check_errors)) {
474
        printf("No errors were found on the image.\n");
475
    } else {
476
        if (result.corruptions) {
477
            printf("\n%d errors were found on the image.\n"
478
                "Data may be corrupted, or further writes to the image "
479
                "may corrupt it.\n",
480
                result.corruptions);
481
        }
482

    
483
        if (result.leaks) {
484
            printf("\n%d leaked clusters were found on the image.\n"
485
                "This means waste of disk space, but no harm to data.\n",
486
                result.leaks);
487
        }
488

    
489
        if (result.check_errors) {
490
            printf("\n%d internal errors have occurred during the check.\n",
491
                result.check_errors);
492
        }
493
    }
494

    
495
    bdrv_delete(bs);
496

    
497
    if (ret < 0 || result.check_errors) {
498
        printf("\nAn error has occurred during the check: %s\n"
499
            "The check is not complete and may have missed error.\n",
500
            strerror(-ret));
501
        return 1;
502
    }
503

    
504
    if (result.corruptions) {
505
        return 2;
506
    } else if (result.leaks) {
507
        return 3;
508
    } else {
509
        return 0;
510
    }
511
}
512

    
513
static int img_commit(int argc, char **argv)
514
{
515
    int c, ret;
516
    const char *filename, *fmt;
517
    BlockDriverState *bs;
518

    
519
    fmt = NULL;
520
    for(;;) {
521
        c = getopt(argc, argv, "f:h");
522
        if (c == -1)
523
            break;
524
        switch(c) {
525
        case 'h':
526
            help();
527
            break;
528
        case 'f':
529
            fmt = optarg;
530
            break;
531
        }
532
    }
533
    if (optind >= argc)
534
        help();
535
    filename = argv[optind++];
536

    
537
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
538
    if (!bs) {
539
        return 1;
540
    }
541
    ret = bdrv_commit(bs);
542
    switch(ret) {
543
    case 0:
544
        printf("Image committed.\n");
545
        break;
546
    case -ENOENT:
547
        error("No disk inserted");
548
        break;
549
    case -EACCES:
550
        error("Image is read-only");
551
        break;
552
    case -ENOTSUP:
553
        error("Image is already committed");
554
        break;
555
    default:
556
        error("Error while committing image");
557
        break;
558
    }
559

    
560
    bdrv_delete(bs);
561
    if (ret) {
562
        return 1;
563
    }
564
    return 0;
565
}
566

    
567
static int is_not_zero(const uint8_t *sector, int len)
568
{
569
    int i;
570
    len >>= 2;
571
    for(i = 0;i < len; i++) {
572
        if (((uint32_t *)sector)[i] != 0)
573
            return 1;
574
    }
575
    return 0;
576
}
577

    
578
/*
579
 * Returns true iff the first sector pointed to by 'buf' contains at least
580
 * a non-NUL byte.
581
 *
582
 * 'pnum' is set to the number of sectors (including and immediately following
583
 * the first one) that are known to be in the same allocated/unallocated state.
584
 */
585
static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum)
586
{
587
    int v, i;
588

    
589
    if (n <= 0) {
590
        *pnum = 0;
591
        return 0;
592
    }
593
    v = is_not_zero(buf, 512);
594
    for(i = 1; i < n; i++) {
595
        buf += 512;
596
        if (v != is_not_zero(buf, 512))
597
            break;
598
    }
599
    *pnum = i;
600
    return v;
601
}
602

    
603
/*
604
 * Compares two buffers sector by sector. Returns 0 if the first sector of both
605
 * buffers matches, non-zero otherwise.
606
 *
607
 * pnum is set to the number of sectors (including and immediately following
608
 * the first one) that are known to have the same comparison result
609
 */
610
static int compare_sectors(const uint8_t *buf1, const uint8_t *buf2, int n,
611
    int *pnum)
612
{
613
    int res, i;
614

    
615
    if (n <= 0) {
616
        *pnum = 0;
617
        return 0;
618
    }
619

    
620
    res = !!memcmp(buf1, buf2, 512);
621
    for(i = 1; i < n; i++) {
622
        buf1 += 512;
623
        buf2 += 512;
624

    
625
        if (!!memcmp(buf1, buf2, 512) != res) {
626
            break;
627
        }
628
    }
629

    
630
    *pnum = i;
631
    return res;
632
}
633

    
634
#define IO_BUF_SIZE (2 * 1024 * 1024)
635

    
636
static int img_convert(int argc, char **argv)
637
{
638
    int c, ret = 0, n, n1, bs_n, bs_i, flags, cluster_size, cluster_sectors;
639
    const char *fmt, *out_fmt, *out_baseimg, *out_filename;
640
    BlockDriver *drv, *proto_drv;
641
    BlockDriverState **bs = NULL, *out_bs = NULL;
642
    int64_t total_sectors, nb_sectors, sector_num, bs_offset;
643
    uint64_t bs_sectors;
644
    uint8_t * buf = NULL;
645
    const uint8_t *buf1;
646
    BlockDriverInfo bdi;
647
    QEMUOptionParameter *param = NULL, *create_options = NULL;
648
    char *options = NULL;
649

    
650
    fmt = NULL;
651
    out_fmt = "raw";
652
    out_baseimg = NULL;
653
    flags = 0;
654
    for(;;) {
655
        c = getopt(argc, argv, "f:O:B:hce6o:");
656
        if (c == -1)
657
            break;
658
        switch(c) {
659
        case 'h':
660
            help();
661
            break;
662
        case 'f':
663
            fmt = optarg;
664
            break;
665
        case 'O':
666
            out_fmt = optarg;
667
            break;
668
        case 'B':
669
            out_baseimg = optarg;
670
            break;
671
        case 'c':
672
            flags |= BLOCK_FLAG_COMPRESS;
673
            break;
674
        case 'e':
675
            flags |= BLOCK_FLAG_ENCRYPT;
676
            break;
677
        case '6':
678
            flags |= BLOCK_FLAG_COMPAT6;
679
            break;
680
        case 'o':
681
            options = optarg;
682
            break;
683
        }
684
    }
685

    
686
    bs_n = argc - optind - 1;
687
    if (bs_n < 1) help();
688

    
689
    out_filename = argv[argc - 1];
690

    
691
    if (bs_n > 1 && out_baseimg) {
692
        error("-B makes no sense when concatenating multiple input images");
693
        return 1;
694
    }
695
        
696
    bs = calloc(bs_n, sizeof(BlockDriverState *));
697
    if (!bs) {
698
        error("Out of memory");
699
        return 1;
700
    }
701

    
702
    total_sectors = 0;
703
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
704
        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS);
705
        if (!bs[bs_i]) {
706
            error("Could not open '%s'", argv[optind + bs_i]);
707
            ret = -1;
708
            goto out;
709
        }
710
        bdrv_get_geometry(bs[bs_i], &bs_sectors);
711
        total_sectors += bs_sectors;
712
    }
713

    
714
    /* Find driver and parse its options */
715
    drv = bdrv_find_format(out_fmt);
716
    if (!drv) {
717
        error("Unknown file format '%s'", out_fmt);
718
        ret = -1;
719
        goto out;
720
    }
721

    
722
    proto_drv = bdrv_find_protocol(out_filename);
723
    if (!proto_drv) {
724
        error("Unknown protocol '%s'", out_filename);
725
        ret = -1;
726
        goto out;
727
    }
728

    
729
    create_options = append_option_parameters(create_options,
730
                                              drv->create_options);
731
    create_options = append_option_parameters(create_options,
732
                                              proto_drv->create_options);
733
    if (options && !strcmp(options, "?")) {
734
        print_option_help(create_options);
735
        goto out;
736
    }
737

    
738
    if (options) {
739
        param = parse_option_parameters(options, create_options, param);
740
        if (param == NULL) {
741
            error("Invalid options for file format '%s'.", out_fmt);
742
            ret = -1;
743
            goto out;
744
        }
745
    } else {
746
        param = parse_option_parameters("", create_options, param);
747
    }
748

    
749
    set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
750
    ret = add_old_style_options(out_fmt, param, flags, out_baseimg, NULL);
751
    if (ret < 0) {
752
        goto out;
753
    }
754

    
755
    /* Check if compression is supported */
756
    if (flags & BLOCK_FLAG_COMPRESS) {
757
        QEMUOptionParameter *encryption =
758
            get_option_parameter(param, BLOCK_OPT_ENCRYPT);
759

    
760
        if (!drv->bdrv_write_compressed) {
761
            error("Compression not supported for this file format");
762
            ret = -1;
763
            goto out;
764
        }
765

    
766
        if (encryption && encryption->value.n) {
767
            error("Compression and encryption not supported at the same time");
768
            ret = -1;
769
            goto out;
770
        }
771
    }
772

    
773
    /* Create the new image */
774
    ret = bdrv_create(drv, out_filename, param);
775
    if (ret < 0) {
776
        if (ret == -ENOTSUP) {
777
            error("Formatting not supported for file format '%s'", out_fmt);
778
        } else if (ret == -EFBIG) {
779
            error("The image size is too large for file format '%s'", out_fmt);
780
        } else {
781
            error("%s: error while converting %s: %s", out_filename, out_fmt, strerror(-ret));
782
        }
783
        goto out;
784
    }
785

    
786
    out_bs = bdrv_new_open(out_filename, out_fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
787
    if (!out_bs) {
788
        ret = -1;
789
        goto out;
790
    }
791

    
792
    bs_i = 0;
793
    bs_offset = 0;
794
    bdrv_get_geometry(bs[0], &bs_sectors);
795
    buf = qemu_malloc(IO_BUF_SIZE);
796

    
797
    if (flags & BLOCK_FLAG_COMPRESS) {
798
        ret = bdrv_get_info(out_bs, &bdi);
799
        if (ret < 0) {
800
            error("could not get block driver info");
801
            goto out;
802
        }
803
        cluster_size = bdi.cluster_size;
804
        if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) {
805
            error("invalid cluster size");
806
            ret = -1;
807
            goto out;
808
        }
809
        cluster_sectors = cluster_size >> 9;
810
        sector_num = 0;
811
        for(;;) {
812
            int64_t bs_num;
813
            int remainder;
814
            uint8_t *buf2;
815

    
816
            nb_sectors = total_sectors - sector_num;
817
            if (nb_sectors <= 0)
818
                break;
819
            if (nb_sectors >= cluster_sectors)
820
                n = cluster_sectors;
821
            else
822
                n = nb_sectors;
823

    
824
            bs_num = sector_num - bs_offset;
825
            assert (bs_num >= 0);
826
            remainder = n;
827
            buf2 = buf;
828
            while (remainder > 0) {
829
                int nlow;
830
                while (bs_num == bs_sectors) {
831
                    bs_i++;
832
                    assert (bs_i < bs_n);
833
                    bs_offset += bs_sectors;
834
                    bdrv_get_geometry(bs[bs_i], &bs_sectors);
835
                    bs_num = 0;
836
                    /* printf("changing part: sector_num=%" PRId64 ", "
837
                       "bs_i=%d, bs_offset=%" PRId64 ", bs_sectors=%" PRId64
838
                       "\n", sector_num, bs_i, bs_offset, bs_sectors); */
839
                }
840
                assert (bs_num < bs_sectors);
841

    
842
                nlow = (remainder > bs_sectors - bs_num) ? bs_sectors - bs_num : remainder;
843

    
844
                ret = bdrv_read(bs[bs_i], bs_num, buf2, nlow);
845
                if (ret < 0) {
846
                    error("error while reading");
847
                    goto out;
848
                }
849

    
850
                buf2 += nlow * 512;
851
                bs_num += nlow;
852

    
853
                remainder -= nlow;
854
            }
855
            assert (remainder == 0);
856

    
857
            if (n < cluster_sectors)
858
                memset(buf + n * 512, 0, cluster_size - n * 512);
859
            if (is_not_zero(buf, cluster_size)) {
860
                ret = bdrv_write_compressed(out_bs, sector_num, buf,
861
                                            cluster_sectors);
862
                if (ret != 0) {
863
                    error("error while compressing sector %" PRId64,
864
                          sector_num);
865
                    goto out;
866
                }
867
            }
868
            sector_num += n;
869
        }
870
        /* signal EOF to align */
871
        bdrv_write_compressed(out_bs, 0, NULL, 0);
872
    } else {
873
        int has_zero_init = bdrv_has_zero_init(out_bs);
874

    
875
        sector_num = 0; // total number of sectors converted so far
876
        for(;;) {
877
            nb_sectors = total_sectors - sector_num;
878
            if (nb_sectors <= 0)
879
                break;
880
            if (nb_sectors >= (IO_BUF_SIZE / 512))
881
                n = (IO_BUF_SIZE / 512);
882
            else
883
                n = nb_sectors;
884

    
885
            while (sector_num - bs_offset >= bs_sectors) {
886
                bs_i ++;
887
                assert (bs_i < bs_n);
888
                bs_offset += bs_sectors;
889
                bdrv_get_geometry(bs[bs_i], &bs_sectors);
890
                /* printf("changing part: sector_num=%" PRId64 ", bs_i=%d, "
891
                  "bs_offset=%" PRId64 ", bs_sectors=%" PRId64 "\n",
892
                   sector_num, bs_i, bs_offset, bs_sectors); */
893
            }
894

    
895
            if (n > bs_offset + bs_sectors - sector_num)
896
                n = bs_offset + bs_sectors - sector_num;
897

    
898
            if (has_zero_init) {
899
                /* If the output image is being created as a copy on write image,
900
                   assume that sectors which are unallocated in the input image
901
                   are present in both the output's and input's base images (no
902
                   need to copy them). */
903
                if (out_baseimg) {
904
                    if (!bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
905
                                           n, &n1)) {
906
                        sector_num += n1;
907
                        continue;
908
                    }
909
                    /* The next 'n1' sectors are allocated in the input image. Copy
910
                       only those as they may be followed by unallocated sectors. */
911
                    n = n1;
912
                }
913
            } else {
914
                n1 = n;
915
            }
916

    
917
            ret = bdrv_read(bs[bs_i], sector_num - bs_offset, buf, n);
918
            if (ret < 0) {
919
                error("error while reading");
920
                goto out;
921
            }
922
            /* NOTE: at the same time we convert, we do not write zero
923
               sectors to have a chance to compress the image. Ideally, we
924
               should add a specific call to have the info to go faster */
925
            buf1 = buf;
926
            while (n > 0) {
927
                /* If the output image is being created as a copy on write image,
928
                   copy all sectors even the ones containing only NUL bytes,
929
                   because they may differ from the sectors in the base image.
930

931
                   If the output is to a host device, we also write out
932
                   sectors that are entirely 0, since whatever data was
933
                   already there is garbage, not 0s. */
934
                if (!has_zero_init || out_baseimg ||
935
                    is_allocated_sectors(buf1, n, &n1)) {
936
                    ret = bdrv_write(out_bs, sector_num, buf1, n1);
937
                    if (ret < 0) {
938
                        error("error while writing");
939
                        goto out;
940
                    }
941
                }
942
                sector_num += n1;
943
                n -= n1;
944
                buf1 += n1 * 512;
945
            }
946
        }
947
    }
948
out:
949
    free_option_parameters(create_options);
950
    free_option_parameters(param);
951
    qemu_free(buf);
952
    if (out_bs) {
953
        bdrv_delete(out_bs);
954
    }
955
    for (bs_i = 0; bs_i < bs_n; bs_i++) {
956
        if (bs[bs_i]) {
957
            bdrv_delete(bs[bs_i]);
958
        }
959
    }
960
    free(bs);
961
    if (ret) {
962
        return 1;
963
    }
964
    return 0;
965
}
966

    
967
#ifdef _WIN32
968
static int64_t get_allocated_file_size(const char *filename)
969
{
970
    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
971
    get_compressed_t get_compressed;
972
    struct _stati64 st;
973

    
974
    /* WinNT support GetCompressedFileSize to determine allocate size */
975
    get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
976
    if (get_compressed) {
977
            DWORD high, low;
978
            low = get_compressed(filename, &high);
979
            if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
980
            return (((int64_t) high) << 32) + low;
981
    }
982

    
983
    if (_stati64(filename, &st) < 0)
984
        return -1;
985
    return st.st_size;
986
}
987
#else
988
static int64_t get_allocated_file_size(const char *filename)
989
{
990
    struct stat st;
991
    if (stat(filename, &st) < 0)
992
        return -1;
993
    return (int64_t)st.st_blocks * 512;
994
}
995
#endif
996

    
997
static void dump_snapshots(BlockDriverState *bs)
998
{
999
    QEMUSnapshotInfo *sn_tab, *sn;
1000
    int nb_sns, i;
1001
    char buf[256];
1002

    
1003
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1004
    if (nb_sns <= 0)
1005
        return;
1006
    printf("Snapshot list:\n");
1007
    printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1008
    for(i = 0; i < nb_sns; i++) {
1009
        sn = &sn_tab[i];
1010
        printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1011
    }
1012
    qemu_free(sn_tab);
1013
}
1014

    
1015
static int img_info(int argc, char **argv)
1016
{
1017
    int c;
1018
    const char *filename, *fmt;
1019
    BlockDriverState *bs;
1020
    char fmt_name[128], size_buf[128], dsize_buf[128];
1021
    uint64_t total_sectors;
1022
    int64_t allocated_size;
1023
    char backing_filename[1024];
1024
    char backing_filename2[1024];
1025
    BlockDriverInfo bdi;
1026

    
1027
    fmt = NULL;
1028
    for(;;) {
1029
        c = getopt(argc, argv, "f:h");
1030
        if (c == -1)
1031
            break;
1032
        switch(c) {
1033
        case 'h':
1034
            help();
1035
            break;
1036
        case 'f':
1037
            fmt = optarg;
1038
            break;
1039
        }
1040
    }
1041
    if (optind >= argc)
1042
        help();
1043
    filename = argv[optind++];
1044

    
1045
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING);
1046
    if (!bs) {
1047
        return 1;
1048
    }
1049
    bdrv_get_format(bs, fmt_name, sizeof(fmt_name));
1050
    bdrv_get_geometry(bs, &total_sectors);
1051
    get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
1052
    allocated_size = get_allocated_file_size(filename);
1053
    if (allocated_size < 0)
1054
        snprintf(dsize_buf, sizeof(dsize_buf), "unavailable");
1055
    else
1056
        get_human_readable_size(dsize_buf, sizeof(dsize_buf),
1057
                                allocated_size);
1058
    printf("image: %s\n"
1059
           "file format: %s\n"
1060
           "virtual size: %s (%" PRId64 " bytes)\n"
1061
           "disk size: %s\n",
1062
           filename, fmt_name, size_buf,
1063
           (total_sectors * 512),
1064
           dsize_buf);
1065
    if (bdrv_is_encrypted(bs))
1066
        printf("encrypted: yes\n");
1067
    if (bdrv_get_info(bs, &bdi) >= 0) {
1068
        if (bdi.cluster_size != 0)
1069
            printf("cluster_size: %d\n", bdi.cluster_size);
1070
    }
1071
    bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename));
1072
    if (backing_filename[0] != '\0') {
1073
        path_combine(backing_filename2, sizeof(backing_filename2),
1074
                     filename, backing_filename);
1075
        printf("backing file: %s (actual path: %s)\n",
1076
               backing_filename,
1077
               backing_filename2);
1078
    }
1079
    dump_snapshots(bs);
1080
    bdrv_delete(bs);
1081
    return 0;
1082
}
1083

    
1084
#define SNAPSHOT_LIST   1
1085
#define SNAPSHOT_CREATE 2
1086
#define SNAPSHOT_APPLY  3
1087
#define SNAPSHOT_DELETE 4
1088

    
1089
static int img_snapshot(int argc, char **argv)
1090
{
1091
    BlockDriverState *bs;
1092
    QEMUSnapshotInfo sn;
1093
    char *filename, *snapshot_name = NULL;
1094
    int c, ret = 0, bdrv_oflags;
1095
    int action = 0;
1096
    qemu_timeval tv;
1097

    
1098
    bdrv_oflags = BDRV_O_RDWR;
1099
    /* Parse commandline parameters */
1100
    for(;;) {
1101
        c = getopt(argc, argv, "la:c:d:h");
1102
        if (c == -1)
1103
            break;
1104
        switch(c) {
1105
        case 'h':
1106
            help();
1107
            return 0;
1108
        case 'l':
1109
            if (action) {
1110
                help();
1111
                return 0;
1112
            }
1113
            action = SNAPSHOT_LIST;
1114
            bdrv_oflags &= ~BDRV_O_RDWR; /* no need for RW */
1115
            break;
1116
        case 'a':
1117
            if (action) {
1118
                help();
1119
                return 0;
1120
            }
1121
            action = SNAPSHOT_APPLY;
1122
            snapshot_name = optarg;
1123
            break;
1124
        case 'c':
1125
            if (action) {
1126
                help();
1127
                return 0;
1128
            }
1129
            action = SNAPSHOT_CREATE;
1130
            snapshot_name = optarg;
1131
            break;
1132
        case 'd':
1133
            if (action) {
1134
                help();
1135
                return 0;
1136
            }
1137
            action = SNAPSHOT_DELETE;
1138
            snapshot_name = optarg;
1139
            break;
1140
        }
1141
    }
1142

    
1143
    if (optind >= argc)
1144
        help();
1145
    filename = argv[optind++];
1146

    
1147
    /* Open the image */
1148
    bs = bdrv_new_open(filename, NULL, bdrv_oflags);
1149
    if (!bs) {
1150
        return 1;
1151
    }
1152

    
1153
    /* Perform the requested action */
1154
    switch(action) {
1155
    case SNAPSHOT_LIST:
1156
        dump_snapshots(bs);
1157
        break;
1158

    
1159
    case SNAPSHOT_CREATE:
1160
        memset(&sn, 0, sizeof(sn));
1161
        pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
1162

    
1163
        qemu_gettimeofday(&tv);
1164
        sn.date_sec = tv.tv_sec;
1165
        sn.date_nsec = tv.tv_usec * 1000;
1166

    
1167
        ret = bdrv_snapshot_create(bs, &sn);
1168
        if (ret)
1169
            error("Could not create snapshot '%s': %d (%s)",
1170
                snapshot_name, ret, strerror(-ret));
1171
        break;
1172

    
1173
    case SNAPSHOT_APPLY:
1174
        ret = bdrv_snapshot_goto(bs, snapshot_name);
1175
        if (ret)
1176
            error("Could not apply snapshot '%s': %d (%s)",
1177
                snapshot_name, ret, strerror(-ret));
1178
        break;
1179

    
1180
    case SNAPSHOT_DELETE:
1181
        ret = bdrv_snapshot_delete(bs, snapshot_name);
1182
        if (ret)
1183
            error("Could not delete snapshot '%s': %d (%s)",
1184
                snapshot_name, ret, strerror(-ret));
1185
        break;
1186
    }
1187

    
1188
    /* Cleanup */
1189
    bdrv_delete(bs);
1190
    if (ret) {
1191
        return 1;
1192
    }
1193
    return 0;
1194
}
1195

    
1196
static int img_rebase(int argc, char **argv)
1197
{
1198
    BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;
1199
    BlockDriver *old_backing_drv, *new_backing_drv;
1200
    char *filename;
1201
    const char *fmt, *out_basefmt, *out_baseimg;
1202
    int c, flags, ret;
1203
    int unsafe = 0;
1204

    
1205
    /* Parse commandline parameters */
1206
    fmt = NULL;
1207
    out_baseimg = NULL;
1208
    out_basefmt = NULL;
1209

    
1210
    for(;;) {
1211
        c = getopt(argc, argv, "uhf:F:b:");
1212
        if (c == -1)
1213
            break;
1214
        switch(c) {
1215
        case 'h':
1216
            help();
1217
            return 0;
1218
        case 'f':
1219
            fmt = optarg;
1220
            break;
1221
        case 'F':
1222
            out_basefmt = optarg;
1223
            break;
1224
        case 'b':
1225
            out_baseimg = optarg;
1226
            break;
1227
        case 'u':
1228
            unsafe = 1;
1229
            break;
1230
        }
1231
    }
1232

    
1233
    if ((optind >= argc) || !out_baseimg)
1234
        help();
1235
    filename = argv[optind++];
1236

    
1237
    /*
1238
     * Open the images.
1239
     *
1240
     * Ignore the old backing file for unsafe rebase in case we want to correct
1241
     * the reference to a renamed or moved backing file.
1242
     */
1243
    flags = BDRV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0);
1244
    bs = bdrv_new_open(filename, fmt, flags);
1245
    if (!bs) {
1246
        return 1;
1247
    }
1248

    
1249
    /* Find the right drivers for the backing files */
1250
    old_backing_drv = NULL;
1251
    new_backing_drv = NULL;
1252

    
1253
    if (!unsafe && bs->backing_format[0] != '\0') {
1254
        old_backing_drv = bdrv_find_format(bs->backing_format);
1255
        if (old_backing_drv == NULL) {
1256
            error("Invalid format name: '%s'", bs->backing_format);
1257
            ret = -1;
1258
            goto out;
1259
        }
1260
    }
1261

    
1262
    if (out_basefmt != NULL) {
1263
        new_backing_drv = bdrv_find_format(out_basefmt);
1264
        if (new_backing_drv == NULL) {
1265
            error("Invalid format name: '%s'", out_basefmt);
1266
            ret = -1;
1267
            goto out;
1268
        }
1269
    }
1270

    
1271
    /* For safe rebasing we need to compare old and new backing file */
1272
    if (unsafe) {
1273
        /* Make the compiler happy */
1274
        bs_old_backing = NULL;
1275
        bs_new_backing = NULL;
1276
    } else {
1277
        char backing_name[1024];
1278

    
1279
        bs_old_backing = bdrv_new("old_backing");
1280
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
1281
        ret = bdrv_open(bs_old_backing, backing_name, BDRV_O_FLAGS,
1282
                        old_backing_drv);
1283
        if (ret) {
1284
            error("Could not open old backing file '%s'", backing_name);
1285
            goto out;
1286
        }
1287

    
1288
        bs_new_backing = bdrv_new("new_backing");
1289
        ret = bdrv_open(bs_new_backing, out_baseimg, BDRV_O_FLAGS | BDRV_O_RDWR,
1290
                        new_backing_drv);
1291
        if (ret) {
1292
            error("Could not open new backing file '%s'", out_baseimg);
1293
            goto out;
1294
        }
1295
    }
1296

    
1297
    /*
1298
     * Check each unallocated cluster in the COW file. If it is unallocated,
1299
     * accesses go to the backing file. We must therefore compare this cluster
1300
     * in the old and new backing file, and if they differ we need to copy it
1301
     * from the old backing file into the COW file.
1302
     *
1303
     * If qemu-img crashes during this step, no harm is done. The content of
1304
     * the image is the same as the original one at any time.
1305
     */
1306
    if (!unsafe) {
1307
        uint64_t num_sectors;
1308
        uint64_t sector;
1309
        int n;
1310
        uint8_t * buf_old;
1311
        uint8_t * buf_new;
1312

    
1313
        buf_old = qemu_malloc(IO_BUF_SIZE);
1314
        buf_new = qemu_malloc(IO_BUF_SIZE);
1315

    
1316
        bdrv_get_geometry(bs, &num_sectors);
1317

    
1318
        for (sector = 0; sector < num_sectors; sector += n) {
1319

    
1320
            /* How many sectors can we handle with the next read? */
1321
            if (sector + (IO_BUF_SIZE / 512) <= num_sectors) {
1322
                n = (IO_BUF_SIZE / 512);
1323
            } else {
1324
                n = num_sectors - sector;
1325
            }
1326

    
1327
            /* If the cluster is allocated, we don't need to take action */
1328
            ret = bdrv_is_allocated(bs, sector, n, &n);
1329
            if (ret) {
1330
                continue;
1331
            }
1332

    
1333
            /* Read old and new backing file */
1334
            ret = bdrv_read(bs_old_backing, sector, buf_old, n);
1335
            if (ret < 0) {
1336
                error("error while reading from old backing file");
1337
                goto out;
1338
            }
1339
            ret = bdrv_read(bs_new_backing, sector, buf_new, n);
1340
            if (ret < 0) {
1341
                error("error while reading from new backing file");
1342
                goto out;
1343
            }
1344

    
1345
            /* If they differ, we need to write to the COW file */
1346
            uint64_t written = 0;
1347

    
1348
            while (written < n) {
1349
                int pnum;
1350

    
1351
                if (compare_sectors(buf_old + written * 512,
1352
                    buf_new + written * 512, n - written, &pnum))
1353
                {
1354
                    ret = bdrv_write(bs, sector + written,
1355
                        buf_old + written * 512, pnum);
1356
                    if (ret < 0) {
1357
                        error("Error while writing to COW image: %s",
1358
                            strerror(-ret));
1359
                        goto out;
1360
                    }
1361
                }
1362

    
1363
                written += pnum;
1364
            }
1365
        }
1366

    
1367
        qemu_free(buf_old);
1368
        qemu_free(buf_new);
1369
    }
1370

    
1371
    /*
1372
     * Change the backing file. All clusters that are different from the old
1373
     * backing file are overwritten in the COW file now, so the visible content
1374
     * doesn't change when we switch the backing file.
1375
     */
1376
    ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
1377
    if (ret == -ENOSPC) {
1378
        error("Could not change the backing file to '%s': No space left in "
1379
            "the file header", out_baseimg);
1380
    } else if (ret < 0) {
1381
        error("Could not change the backing file to '%s': %s",
1382
            out_baseimg, strerror(-ret));
1383
    }
1384

    
1385
    /*
1386
     * TODO At this point it is possible to check if any clusters that are
1387
     * allocated in the COW file are the same in the backing file. If so, they
1388
     * could be dropped from the COW file. Don't do this before switching the
1389
     * backing file, in case of a crash this would lead to corruption.
1390
     */
1391
out:
1392
    /* Cleanup */
1393
    if (!unsafe) {
1394
        bdrv_delete(bs_old_backing);
1395
        bdrv_delete(bs_new_backing);
1396
    }
1397

    
1398
    bdrv_delete(bs);
1399
    if (ret) {
1400
        return 1;
1401
    }
1402
    return 0;
1403
}
1404

    
1405
static int img_resize(int argc, char **argv)
1406
{
1407
    int c, ret, relative;
1408
    const char *filename, *fmt, *size;
1409
    int64_t n, total_size;
1410
    BlockDriverState *bs;
1411
    QEMUOptionParameter *param;
1412
    QEMUOptionParameter resize_options[] = {
1413
        {
1414
            .name = BLOCK_OPT_SIZE,
1415
            .type = OPT_SIZE,
1416
            .help = "Virtual disk size"
1417
        },
1418
        { NULL }
1419
    };
1420

    
1421
    fmt = NULL;
1422
    for(;;) {
1423
        c = getopt(argc, argv, "f:h");
1424
        if (c == -1) {
1425
            break;
1426
        }
1427
        switch(c) {
1428
        case 'h':
1429
            help();
1430
            break;
1431
        case 'f':
1432
            fmt = optarg;
1433
            break;
1434
        }
1435
    }
1436
    if (optind + 1 >= argc) {
1437
        help();
1438
    }
1439
    filename = argv[optind++];
1440
    size = argv[optind++];
1441

    
1442
    /* Choose grow, shrink, or absolute resize mode */
1443
    switch (size[0]) {
1444
    case '+':
1445
        relative = 1;
1446
        size++;
1447
        break;
1448
    case '-':
1449
        relative = -1;
1450
        size++;
1451
        break;
1452
    default:
1453
        relative = 0;
1454
        break;
1455
    }
1456

    
1457
    /* Parse size */
1458
    param = parse_option_parameters("", resize_options, NULL);
1459
    if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) {
1460
        /* Error message already printed when size parsing fails */
1461
        exit(1);
1462
    }
1463
    n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n;
1464
    free_option_parameters(param);
1465

    
1466
    bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR);
1467
    if (!bs) {
1468
        return 1;
1469
    }
1470

    
1471
    if (relative) {
1472
        total_size = bdrv_getlength(bs) + n * relative;
1473
    } else {
1474
        total_size = n;
1475
    }
1476
    if (total_size <= 0) {
1477
        error("New image size must be positive");
1478
        ret = -1;
1479
        goto out;
1480
    }
1481

    
1482
    ret = bdrv_truncate(bs, total_size);
1483
    switch (ret) {
1484
    case 0:
1485
        printf("Image resized.\n");
1486
        break;
1487
    case -ENOTSUP:
1488
        error("This image format does not support resize");
1489
        break;
1490
    case -EACCES:
1491
        error("Image is read-only");
1492
        break;
1493
    default:
1494
        error("Error resizing image (%d)", -ret);
1495
        break;
1496
    }
1497
out:
1498
    bdrv_delete(bs);
1499
    if (ret) {
1500
        return 1;
1501
    }
1502
    return 0;
1503
}
1504

    
1505
static const img_cmd_t img_cmds[] = {
1506
#define DEF(option, callback, arg_string)        \
1507
    { option, callback },
1508
#include "qemu-img-cmds.h"
1509
#undef DEF
1510
#undef GEN_DOCS
1511
    { NULL, NULL, },
1512
};
1513

    
1514
int main(int argc, char **argv)
1515
{
1516
    const img_cmd_t *cmd;
1517
    const char *cmdname;
1518

    
1519
    bdrv_init();
1520
    if (argc < 2)
1521
        help();
1522
    cmdname = argv[1];
1523
    argc--; argv++;
1524

    
1525
    /* find the command */
1526
    for(cmd = img_cmds; cmd->name != NULL; cmd++) {
1527
        if (!strcmp(cmdname, cmd->name)) {
1528
            return cmd->handler(argc, argv);
1529
        }
1530
    }
1531

    
1532
    /* not found */
1533
    help();
1534
    return 0;
1535
}