version 1.1.1.2, 2018/04/24 16:42:46
|
version 1.1.1.3, 2018/04/24 16:45:00
|
Line 1
|
Line 1
|
/* |
/* |
* create a COW disk image |
* QEMU disk image utility |
* |
* |
* Copyright (c) 2003 Fabrice Bellard |
* Copyright (c) 2003-2007 Fabrice Bellard |
* |
* |
* Permission is hereby granted, free of charge, to any person obtaining a copy |
* Permission is hereby granted, free of charge, to any person obtaining a copy |
* of this software and associated documentation files (the "Software"), to deal |
* of this software and associated documentation files (the "Software"), to deal |
Line 62 char *qemu_strdup(const char *str)
|
Line 62 char *qemu_strdup(const char *str)
|
return ptr; |
return ptr; |
} |
} |
|
|
void pstrcpy(char *buf, int buf_size, const char *str) |
|
{ |
|
int c; |
|
char *q = buf; |
|
|
|
if (buf_size <= 0) |
|
return; |
|
|
|
for(;;) { |
|
c = *str++; |
|
if (c == 0 || q >= buf + buf_size - 1) |
|
break; |
|
*q++ = c; |
|
} |
|
*q = '\0'; |
|
} |
|
|
|
/* strcat and truncate. */ |
|
char *pstrcat(char *buf, int buf_size, const char *s) |
|
{ |
|
int len; |
|
len = strlen(buf); |
|
if (len < buf_size) |
|
pstrcpy(buf + len, buf_size - len, s); |
|
return buf; |
|
} |
|
|
|
int strstart(const char *str, const char *val, const char **ptr) |
|
{ |
|
const char *p, *q; |
|
p = str; |
|
q = val; |
|
while (*q != '\0') { |
|
if (*p != *q) |
|
return 0; |
|
p++; |
|
q++; |
|
} |
|
if (ptr) |
|
*ptr = p; |
|
return 1; |
|
} |
|
|
|
void term_printf(const char *fmt, ...) |
void term_printf(const char *fmt, ...) |
{ |
{ |
va_list ap; |
va_list ap; |
Line 113 void term_printf(const char *fmt, ...)
|
Line 70 void term_printf(const char *fmt, ...)
|
va_end(ap); |
va_end(ap); |
} |
} |
|
|
|
void term_print_filename(const char *filename) |
|
{ |
|
term_printf(filename); |
|
} |
|
|
void __attribute__((noreturn)) error(const char *fmt, ...) |
void __attribute__((noreturn)) error(const char *fmt, ...) |
{ |
{ |
va_list ap; |
va_list ap; |
Line 131 static void format_print(void *opaque, c
|
Line 93 static void format_print(void *opaque, c
|
|
|
void help(void) |
void help(void) |
{ |
{ |
printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2005 Fabrice Bellard\n" |
printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2007 Fabrice Bellard\n" |
"usage: qemu-img command [command options]\n" |
"usage: qemu-img command [command options]\n" |
"QEMU disk image utility\n" |
"QEMU disk image utility\n" |
"\n" |
"\n" |
Line 159 void help(void)
|
Line 121 void help(void)
|
exit(1); |
exit(1); |
} |
} |
|
|
|
|
#define NB_SUFFIXES 4 |
|
|
|
static void get_human_readable_size(char *buf, int buf_size, int64_t size) |
|
{ |
|
static const char suffixes[NB_SUFFIXES] = "KMGT"; |
|
int64_t base; |
|
int i; |
|
|
|
if (size <= 999) { |
|
snprintf(buf, buf_size, "%" PRId64, size); |
|
} else { |
|
base = 1024; |
|
for(i = 0; i < NB_SUFFIXES; i++) { |
|
if (size < (10 * base)) { |
|
snprintf(buf, buf_size, "%0.1f%c", |
|
(double)size / base, |
|
suffixes[i]); |
|
break; |
|
} else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) { |
|
snprintf(buf, buf_size, "%" PRId64 "%c", |
|
((size + (base >> 1)) / base), |
|
suffixes[i]); |
|
break; |
|
} |
|
base = base * 1024; |
|
} |
|
} |
|
} |
|
|
|
#if defined(WIN32) |
#if defined(WIN32) |
/* XXX: put correct support for win32 */ |
/* XXX: put correct support for win32 */ |
static int read_password(char *buf, int buf_size) |
static int read_password(char *buf, int buf_size) |
Line 486 static int img_convert(int argc, char **
|
Line 418 static int img_convert(int argc, char **
|
int64_t total_sectors, nb_sectors, sector_num; |
int64_t total_sectors, nb_sectors, sector_num; |
uint8_t buf[IO_BUF_SIZE]; |
uint8_t buf[IO_BUF_SIZE]; |
const uint8_t *buf1; |
const uint8_t *buf1; |
|
BlockDriverInfo bdi; |
|
|
fmt = NULL; |
fmt = NULL; |
out_fmt = "raw"; |
out_fmt = "raw"; |
Line 525 static int img_convert(int argc, char **
|
Line 458 static int img_convert(int argc, char **
|
drv = bdrv_find_format(out_fmt); |
drv = bdrv_find_format(out_fmt); |
if (!drv) |
if (!drv) |
error("Unknown file format '%s'", fmt); |
error("Unknown file format '%s'", fmt); |
if (compress && drv != &bdrv_qcow) |
if (compress && drv != &bdrv_qcow && drv != &bdrv_qcow2) |
error("Compression not supported for this file format"); |
error("Compression not supported for this file format"); |
if (encrypt && drv != &bdrv_qcow) |
if (encrypt && drv != &bdrv_qcow && drv != &bdrv_qcow2) |
error("Encryption not supported for this file format"); |
error("Encryption not supported for this file format"); |
if (compress && encrypt) |
if (compress && encrypt) |
error("Compression and encryption not supported at the same time"); |
error("Compression and encryption not supported at the same time"); |
Line 544 static int img_convert(int argc, char **
|
Line 477 static int img_convert(int argc, char **
|
out_bs = bdrv_new_open(out_filename, out_fmt); |
out_bs = bdrv_new_open(out_filename, out_fmt); |
|
|
if (compress) { |
if (compress) { |
cluster_size = qcow_get_cluster_size(out_bs); |
if (bdrv_get_info(out_bs, &bdi) < 0) |
|
error("could not get block driver info"); |
|
cluster_size = bdi.cluster_size; |
if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) |
if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) |
error("invalid cluster size"); |
error("invalid cluster size"); |
cluster_sectors = cluster_size >> 9; |
cluster_sectors = cluster_size >> 9; |
Line 562 static int img_convert(int argc, char **
|
Line 497 static int img_convert(int argc, char **
|
if (n < cluster_sectors) |
if (n < cluster_sectors) |
memset(buf + n * 512, 0, cluster_size - n * 512); |
memset(buf + n * 512, 0, cluster_size - n * 512); |
if (is_not_zero(buf, cluster_size)) { |
if (is_not_zero(buf, cluster_size)) { |
if (qcow_compress_cluster(out_bs, sector_num, buf) != 0) |
if (bdrv_write_compressed(out_bs, sector_num, buf, |
|
cluster_sectors) != 0) |
error("error while compressing sector %" PRId64, |
error("error while compressing sector %" PRId64, |
sector_num); |
sector_num); |
} |
} |
sector_num += n; |
sector_num += n; |
} |
} |
|
/* signal EOF to align */ |
|
bdrv_write_compressed(out_bs, 0, NULL, 0); |
} else { |
} else { |
sector_num = 0; |
sector_num = 0; |
for(;;) { |
for(;;) { |
Line 630 static int64_t get_allocated_file_size(c
|
Line 568 static int64_t get_allocated_file_size(c
|
} |
} |
#endif |
#endif |
|
|
|
static void dump_snapshots(BlockDriverState *bs) |
|
{ |
|
QEMUSnapshotInfo *sn_tab, *sn; |
|
int nb_sns, i; |
|
char buf[256]; |
|
|
|
nb_sns = bdrv_snapshot_list(bs, &sn_tab); |
|
if (nb_sns <= 0) |
|
return; |
|
printf("Snapshot list:\n"); |
|
printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL)); |
|
for(i = 0; i < nb_sns; i++) { |
|
sn = &sn_tab[i]; |
|
printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn)); |
|
} |
|
qemu_free(sn_tab); |
|
} |
|
|
static int img_info(int argc, char **argv) |
static int img_info(int argc, char **argv) |
{ |
{ |
int c; |
int c; |
Line 638 static int img_info(int argc, char **arg
|
Line 594 static int img_info(int argc, char **arg
|
BlockDriverState *bs; |
BlockDriverState *bs; |
char fmt_name[128], size_buf[128], dsize_buf[128]; |
char fmt_name[128], size_buf[128], dsize_buf[128]; |
int64_t total_sectors, allocated_size; |
int64_t total_sectors, allocated_size; |
|
char backing_filename[1024]; |
|
char backing_filename2[1024]; |
|
BlockDriverInfo bdi; |
|
|
fmt = NULL; |
fmt = NULL; |
for(;;) { |
for(;;) { |
Line 688 static int img_info(int argc, char **arg
|
Line 647 static int img_info(int argc, char **arg
|
dsize_buf); |
dsize_buf); |
if (bdrv_is_encrypted(bs)) |
if (bdrv_is_encrypted(bs)) |
printf("encrypted: yes\n"); |
printf("encrypted: yes\n"); |
|
if (bdrv_get_info(bs, &bdi) >= 0) { |
|
if (bdi.cluster_size != 0) |
|
printf("cluster_size: %d\n", bdi.cluster_size); |
|
} |
|
bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename)); |
|
if (backing_filename[0] != '\0') { |
|
path_combine(backing_filename2, sizeof(backing_filename2), |
|
filename, backing_filename); |
|
printf("backing file: %s (actual path: %s)\n", |
|
backing_filename, |
|
backing_filename2); |
|
} |
|
dump_snapshots(bs); |
bdrv_delete(bs); |
bdrv_delete(bs); |
return 0; |
return 0; |
} |
} |