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) | ... | ... |