]>
Commit | Line | Data |
---|---|---|
c854115a WB |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
83faa3fe TL |
3 | Date: Mon, 6 Apr 2020 12:16:41 +0200 |
4 | Subject: [PATCH] PVE: [Up] qemu-img dd: add isize parameter | |
c854115a WB |
5 | |
6 | for writing small images from stdin to bigger ones | |
7 | ||
8 | In order to distinguish between an actually unexpected and | |
9 | an expected end of input. | |
10 | ||
11 | Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
b855dce7 | 12 | Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> |
5b15e2ec | 13 | Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> |
c854115a | 14 | --- |
60ae3775 SR |
15 | qemu-img.c | 28 +++++++++++++++++++++++++--- |
16 | 1 file changed, 25 insertions(+), 3 deletions(-) | |
c854115a WB |
17 | |
18 | diff --git a/qemu-img.c b/qemu-img.c | |
d03e1b3c | 19 | index 221b9d6a16..c1306385a8 100644 |
c854115a WB |
20 | --- a/qemu-img.c |
21 | +++ b/qemu-img.c | |
d03e1b3c | 22 | @@ -4830,11 +4830,13 @@ static int img_bitmap(int argc, char **argv) |
c854115a WB |
23 | #define C_OF 010 |
24 | #define C_SKIP 020 | |
25 | #define C_OSIZE 040 | |
26 | +#define C_ISIZE 0100 | |
27 | ||
28 | struct DdInfo { | |
29 | unsigned int flags; | |
30 | int64_t count; | |
31 | int64_t osize; | |
32 | + int64_t isize; | |
33 | }; | |
34 | ||
35 | struct DdIo { | |
d03e1b3c | 36 | @@ -4923,6 +4925,19 @@ static int img_dd_osize(const char *arg, |
c854115a WB |
37 | return 0; |
38 | } | |
39 | ||
40 | +static int img_dd_isize(const char *arg, | |
41 | + struct DdIo *in, struct DdIo *out, | |
42 | + struct DdInfo *dd) | |
43 | +{ | |
60ae3775 | 44 | + dd->isize = cvtnum("size", arg); |
c854115a WB |
45 | + |
46 | + if (dd->isize < 0) { | |
c854115a WB |
47 | + return 1; |
48 | + } | |
49 | + | |
50 | + return 0; | |
51 | +} | |
52 | + | |
53 | static int img_dd(int argc, char **argv) | |
54 | { | |
55 | int ret = 0; | |
d03e1b3c | 56 | @@ -4937,12 +4952,14 @@ static int img_dd(int argc, char **argv) |
c854115a WB |
57 | int c, i; |
58 | const char *out_fmt = "raw"; | |
59 | const char *fmt = NULL; | |
60 | - int64_t size = 0; | |
61 | + int64_t size = 0, readsize = 0; | |
d03e1b3c | 62 | int64_t out_pos, in_pos; |
c854115a WB |
63 | bool force_share = false; |
64 | struct DdInfo dd = { | |
65 | .flags = 0, | |
66 | .count = 0, | |
67 | + .osize = 0, | |
68 | + .isize = -1, | |
69 | }; | |
70 | struct DdIo in = { | |
71 | .bsz = 512, /* Block size is by default 512 bytes */ | |
d03e1b3c | 72 | @@ -4964,6 +4981,7 @@ static int img_dd(int argc, char **argv) |
c854115a WB |
73 | { "of", img_dd_of, C_OF }, |
74 | { "skip", img_dd_skip, C_SKIP }, | |
75 | { "osize", img_dd_osize, C_OSIZE }, | |
76 | + { "isize", img_dd_isize, C_ISIZE }, | |
77 | { NULL, NULL, 0 } | |
78 | }; | |
79 | const struct option long_options[] = { | |
d03e1b3c | 80 | @@ -5160,9 +5178,10 @@ static int img_dd(int argc, char **argv) |
c854115a WB |
81 | |
82 | in.buf = g_new(uint8_t, in.bsz); | |
83 | ||
d03e1b3c | 84 | - for (out_pos = 0; in_pos < size; ) { |
c854115a | 85 | + readsize = (dd.isize > 0) ? dd.isize : size; |
d03e1b3c | 86 | + for (out_pos = 0; in_pos < readsize; ) { |
c854115a | 87 | int in_ret, out_ret; |
5b15e2ec FE |
88 | - int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz; |
89 | + int bytes = (in_pos + in.bsz > readsize) ? readsize - in_pos : in.bsz; | |
c854115a | 90 | if (blk1) { |
5b15e2ec FE |
91 | in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0); |
92 | if (in_ret == 0) { | |
d03e1b3c | 93 | @@ -5171,6 +5190,9 @@ static int img_dd(int argc, char **argv) |
c854115a | 94 | } else { |
5b15e2ec | 95 | in_ret = read(STDIN_FILENO, in.buf, bytes); |
c854115a WB |
96 | if (in_ret == 0) { |
97 | + if (dd.isize == 0) { | |
98 | + goto out; | |
99 | + } | |
100 | /* early EOF is considered an error */ | |
101 | error_report("Input ended unexpectedly"); | |
102 | ret = -1; |