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 | 273 | } |
| 274 | 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 | 306 | static int img_create(int argc, char **argv) |
| 277 | 307 | { |
| 278 | 308 | int c, ret, encrypted; |
| ... | ... | @@ -308,7 +338,13 @@ static int img_create(int argc, char **argv) |
| 308 | 338 | help(); |
| 309 | 339 | filename = argv[optind++]; |
| 310 | 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 | 348 | if (optind >= argc) |
| 313 | 349 | help(); |
| 314 | 350 | p = argv[optind]; |
| ... | ... | @@ -330,11 +366,11 @@ static int img_create(int argc, char **argv) |
| 330 | 366 | filename, fmt); |
| 331 | 367 | if (encrypted) |
| 332 | 368 | printf(", encrypted"); |
| 333 | - if (base_filename) | |
| 334 | - printf(", backing_file=%s\n", | |
| 369 | + if (base_filename) { | |
| 370 | + printf(", backing_file=%s", | |
| 335 | 371 | base_filename); |
| 336 | - else | |
| 337 | - printf(", size=%lld kB\n", size / 1024); | |
| 372 | + } | |
| 373 | + printf(", size=%lld kB\n", size / 1024); | |
| 338 | 374 | ret = bdrv_create(drv, filename, size / 512, base_filename, encrypted); |
| 339 | 375 | if (ret < 0) { |
| 340 | 376 | if (ret == -ENOTSUP) { |
| ... | ... | @@ -437,36 +473,6 @@ static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum) |
| 437 | 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 | 476 | #define IO_BUF_SIZE 65536 |
| 471 | 477 | |
| 472 | 478 | static int img_convert(int argc, char **argv) | ... | ... |