Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
qemu-img-cmds.hx | 4 +-
- qemu-img.c | 187 +++++++++++++++++++++++++++++------------------
- 2 files changed, 119 insertions(+), 72 deletions(-)
+ qemu-img.c | 202 ++++++++++++++++++++++++++++++-----------------
+ 2 files changed, 133 insertions(+), 73 deletions(-)
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
-index b3620f29e5..e70ef3dc91 100644
+index 1b1dab5b17..d1616c045a 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -58,9 +58,9 @@ SRST
DEF("info", img_info,
diff --git a/qemu-img.c b/qemu-img.c
-index 5dc1d0a2ca..f773182bd0 100644
+index 0919fac1f1..c584de648c 100644
--- a/qemu-img.c
+++ b/qemu-img.c
-@@ -4793,10 +4793,12 @@ static int img_bitmap(int argc, char **argv)
+@@ -4885,10 +4885,12 @@ static int img_bitmap(int argc, char **argv)
#define C_IF 04
#define C_OF 010
#define C_SKIP 020
};
struct DdIo {
-@@ -4872,6 +4874,19 @@ static int img_dd_skip(const char *arg,
+@@ -4964,6 +4966,19 @@ static int img_dd_skip(const char *arg,
return 0;
}
static int img_dd(int argc, char **argv)
{
int ret = 0;
-@@ -4912,6 +4927,7 @@ static int img_dd(int argc, char **argv)
+@@ -5004,6 +5019,7 @@ static int img_dd(int argc, char **argv)
{ "if", img_dd_if, C_IF },
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
-@@ -4987,91 +5003,112 @@ static int img_dd(int argc, char **argv)
+@@ -5079,91 +5095,112 @@ static int img_dd(int argc, char **argv)
arg = NULL;
}
}
- create_opts = qemu_opts_append(create_opts, drv->create_opts);
- create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
-
-- opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
-
+- opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
+
- size = blk_getlength(blk1);
- if (size < 0) {
- error_report("Failed to get size for '%s'", in.filename);
}
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
-@@ -5089,11 +5126,17 @@ static int img_dd(int argc, char **argv)
+@@ -5180,20 +5217,43 @@ static int img_dd(int argc, char **argv)
+ in.buf = g_new(uint8_t, in.bsz);
- for (out_pos = 0; in_pos < size; block_count++) {
- int in_ret, out_ret;
+ for (out_pos = 0; in_pos < size; ) {
++ int in_ret, out_ret;
+ int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
-
-- if (in_pos + in.bsz > size) {
-- in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
-+ size_t in_bsz = in_pos + in.bsz > size ? size - in_pos : in.bsz;
+- ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
+- if (ret < 0) {
+ if (blk1) {
-+ in_ret = blk_pread(blk1, in_pos, in.buf, in_bsz);
- } else {
-- in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
-+ in_ret = read(STDIN_FILENO, in.buf, in_bsz);
++ in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
++ if (in_ret == 0) {
++ in_ret = bytes;
++ }
++ } else {
++ in_ret = read(STDIN_FILENO, in.buf, bytes);
+ if (in_ret == 0) {
+ /* early EOF is considered an error */
+ error_report("Input ended unexpectedly");
+ ret = -1;
+ goto out;
+ }
- }
- if (in_ret < 0) {
++ }
++ if (in_ret < 0) {
error_report("error while reading from input image file: %s",
-@@ -5103,9 +5146,13 @@ static int img_dd(int argc, char **argv)
+- strerror(-ret));
++ strerror(-in_ret));
++ ret = -1;
+ goto out;
}
- in_pos += in_ret;
+ in_pos += bytes;
-- out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0);
+- ret = blk_pwrite(blk2, out_pos, bytes, in.buf, 0);
+- if (ret < 0) {
+ if (blk2) {
-+ out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0);
++ out_ret = blk_pwrite(blk2, out_pos, in_ret, in.buf, 0);
++ if (out_ret == 0) {
++ out_ret = in_ret;
++ }
+ } else {
+ out_ret = write(STDOUT_FILENO, in.buf, in_ret);
+ }
-
-- if (out_ret < 0) {
++
+ if (out_ret != in_ret) {
error_report("error while writing to output image file: %s",
- strerror(-out_ret));
- ret = -1;
+- strerror(-ret));
++ strerror(-out_ret));
++ ret = -1;
+ goto out;
+ }
+ out_pos += bytes;