Commit 75c238058423fba689599dda4bed2b5bb7634570
1 parent
7c08dbf3
fixed image creation with base filename
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1056 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
41 additions
and
35 deletions
qemu-img.c
| @@ -273,6 +273,36 @@ int read_password(char *buf, int buf_size) | @@ -273,6 +273,36 @@ int read_password(char *buf, int buf_size) | ||
| 273 | } | 273 | } |
| 274 | #endif | 274 | #endif |
| 275 | 275 | ||
| 276 | +static BlockDriverState *bdrv_new_open(const char *filename, | ||
| 277 | + const char *fmt) | ||
| 278 | +{ | ||
| 279 | + BlockDriverState *bs; | ||
| 280 | + BlockDriver *drv; | ||
| 281 | + char password[256]; | ||
| 282 | + | ||
| 283 | + bs = bdrv_new(""); | ||
| 284 | + if (!bs) | ||
| 285 | + error("Not enough memory"); | ||
| 286 | + if (fmt) { | ||
| 287 | + drv = bdrv_find_format(fmt); | ||
| 288 | + if (!drv) | ||
| 289 | + error("Unknown file format '%s'", fmt); | ||
| 290 | + } else { | ||
| 291 | + drv = NULL; | ||
| 292 | + } | ||
| 293 | + if (bdrv_open2(bs, filename, 0, drv) < 0) { | ||
| 294 | + error("Could not open '%s'", filename); | ||
| 295 | + } | ||
| 296 | + if (bdrv_is_encrypted(bs)) { | ||
| 297 | + printf("Disk image '%s' is encrypted.\n", filename); | ||
| 298 | + if (read_password(password, sizeof(password)) < 0) | ||
| 299 | + error("No password given"); | ||
| 300 | + if (bdrv_set_key(bs, password) < 0) | ||
| 301 | + error("invalid password"); | ||
| 302 | + } | ||
| 303 | + return bs; | ||
| 304 | +} | ||
| 305 | + | ||
| 276 | static int img_create(int argc, char **argv) | 306 | static int img_create(int argc, char **argv) |
| 277 | { | 307 | { |
| 278 | int c, ret, encrypted; | 308 | int c, ret, encrypted; |
| @@ -308,7 +338,13 @@ static int img_create(int argc, char **argv) | @@ -308,7 +338,13 @@ static int img_create(int argc, char **argv) | ||
| 308 | help(); | 338 | help(); |
| 309 | filename = argv[optind++]; | 339 | filename = argv[optind++]; |
| 310 | size = 0; | 340 | size = 0; |
| 311 | - if (!base_filename) { | 341 | + if (base_filename) { |
| 342 | + BlockDriverState *bs; | ||
| 343 | + bs = bdrv_new_open(base_filename, NULL); | ||
| 344 | + bdrv_get_geometry(bs, &size); | ||
| 345 | + size *= 512; | ||
| 346 | + bdrv_delete(bs); | ||
| 347 | + } else { | ||
| 312 | if (optind >= argc) | 348 | if (optind >= argc) |
| 313 | help(); | 349 | help(); |
| 314 | p = argv[optind]; | 350 | p = argv[optind]; |
| @@ -330,11 +366,11 @@ static int img_create(int argc, char **argv) | @@ -330,11 +366,11 @@ static int img_create(int argc, char **argv) | ||
| 330 | filename, fmt); | 366 | filename, fmt); |
| 331 | if (encrypted) | 367 | if (encrypted) |
| 332 | printf(", encrypted"); | 368 | printf(", encrypted"); |
| 333 | - if (base_filename) | ||
| 334 | - printf(", backing_file=%s\n", | 369 | + if (base_filename) { |
| 370 | + printf(", backing_file=%s", | ||
| 335 | base_filename); | 371 | base_filename); |
| 336 | - else | ||
| 337 | - printf(", size=%lld kB\n", size / 1024); | 372 | + } |
| 373 | + printf(", size=%lld kB\n", size / 1024); | ||
| 338 | ret = bdrv_create(drv, filename, size / 512, base_filename, encrypted); | 374 | ret = bdrv_create(drv, filename, size / 512, base_filename, encrypted); |
| 339 | if (ret < 0) { | 375 | if (ret < 0) { |
| 340 | if (ret == -ENOTSUP) { | 376 | if (ret == -ENOTSUP) { |
| @@ -437,36 +473,6 @@ static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum) | @@ -437,36 +473,6 @@ static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum) | ||
| 437 | return v; | 473 | return v; |
| 438 | } | 474 | } |
| 439 | 475 | ||
| 440 | -static BlockDriverState *bdrv_new_open(const char *filename, | ||
| 441 | - const char *fmt) | ||
| 442 | -{ | ||
| 443 | - BlockDriverState *bs; | ||
| 444 | - BlockDriver *drv; | ||
| 445 | - char password[256]; | ||
| 446 | - | ||
| 447 | - bs = bdrv_new(""); | ||
| 448 | - if (!bs) | ||
| 449 | - error("Not enough memory"); | ||
| 450 | - if (fmt) { | ||
| 451 | - drv = bdrv_find_format(fmt); | ||
| 452 | - if (!drv) | ||
| 453 | - error("Unknown file format '%s'", fmt); | ||
| 454 | - } else { | ||
| 455 | - drv = NULL; | ||
| 456 | - } | ||
| 457 | - if (bdrv_open2(bs, filename, 0, drv) < 0) { | ||
| 458 | - error("Could not open '%s'", filename); | ||
| 459 | - } | ||
| 460 | - if (bdrv_is_encrypted(bs)) { | ||
| 461 | - printf("Disk image '%s' is encrypted.\n", filename); | ||
| 462 | - if (read_password(password, sizeof(password)) < 0) | ||
| 463 | - error("No password given"); | ||
| 464 | - if (bdrv_set_key(bs, password) < 0) | ||
| 465 | - error("invalid password"); | ||
| 466 | - } | ||
| 467 | - return bs; | ||
| 468 | -} | ||
| 469 | - | ||
| 470 | #define IO_BUF_SIZE 65536 | 476 | #define IO_BUF_SIZE 65536 |
| 471 | 477 | ||
| 472 | static int img_convert(int argc, char **argv) | 478 | static int img_convert(int argc, char **argv) |