]> git.proxmox.com Git - pve-qemu.git/blob - debian/patches/pve/0029-qemu-img-dd-add-isize-parameter.patch
bump version to 2.11.2-1
[pve-qemu.git] / debian / patches / pve / 0029-qemu-img-dd-add-isize-parameter.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 Date: Fri, 23 Feb 2018 08:43:18 +0100
4 Subject: [PATCH] qemu-img dd: add isize parameter
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>
12 ---
13 qemu-img.c | 29 ++++++++++++++++++++++++++---
14 1 file changed, 26 insertions(+), 3 deletions(-)
15
16 diff --git a/qemu-img.c b/qemu-img.c
17 index 879e7f4502..e23285d7d4 100644
18 --- a/qemu-img.c
19 +++ b/qemu-img.c
20 @@ -4110,11 +4110,13 @@ out:
21 #define C_OF 010
22 #define C_SKIP 020
23 #define C_OSIZE 040
24 +#define C_ISIZE 0100
25
26 struct DdInfo {
27 unsigned int flags;
28 int64_t count;
29 int64_t osize;
30 + int64_t isize;
31 };
32
33 struct DdIo {
34 @@ -4207,6 +4209,20 @@ static int img_dd_osize(const char *arg,
35 return 0;
36 }
37
38 +static int img_dd_isize(const char *arg,
39 + struct DdIo *in, struct DdIo *out,
40 + struct DdInfo *dd)
41 +{
42 + dd->isize = cvtnum(arg);
43 +
44 + if (dd->isize < 0) {
45 + error_report("invalid number: '%s'", arg);
46 + return 1;
47 + }
48 +
49 + return 0;
50 +}
51 +
52 static int img_dd(int argc, char **argv)
53 {
54 int ret = 0;
55 @@ -4221,12 +4237,14 @@ static int img_dd(int argc, char **argv)
56 int c, i;
57 const char *out_fmt = "raw";
58 const char *fmt = NULL;
59 - int64_t size = 0;
60 + int64_t size = 0, readsize = 0;
61 int64_t block_count = 0, out_pos, in_pos;
62 bool force_share = false;
63 struct DdInfo dd = {
64 .flags = 0,
65 .count = 0,
66 + .osize = 0,
67 + .isize = -1,
68 };
69 struct DdIo in = {
70 .bsz = 512, /* Block size is by default 512 bytes */
71 @@ -4248,6 +4266,7 @@ static int img_dd(int argc, char **argv)
72 { "of", img_dd_of, C_OF },
73 { "skip", img_dd_skip, C_SKIP },
74 { "osize", img_dd_osize, C_OSIZE },
75 + { "isize", img_dd_isize, C_ISIZE },
76 { NULL, NULL, 0 }
77 };
78 const struct option long_options[] = {
79 @@ -4454,14 +4473,18 @@ static int img_dd(int argc, char **argv)
80
81 in.buf = g_new(uint8_t, in.bsz);
82
83 - for (out_pos = 0; in_pos < size; block_count++) {
84 + readsize = (dd.isize > 0) ? dd.isize : size;
85 + for (out_pos = 0; in_pos < readsize; block_count++) {
86 int in_ret, out_ret;
87 - size_t in_bsz = in_pos + in.bsz > size ? size - in_pos : in.bsz;
88 + size_t in_bsz = in_pos + in.bsz > readsize ? readsize - in_pos : in.bsz;
89 if (blk1) {
90 in_ret = blk_pread(blk1, in_pos, in.buf, in_bsz);
91 } else {
92 in_ret = read(STDIN_FILENO, in.buf, in_bsz);
93 if (in_ret == 0) {
94 + if (dd.isize == 0) {
95 + goto out;
96 + }
97 /* early EOF is considered an error */
98 error_report("Input ended unexpectedly");
99 ret = -1;
100 --
101 2.11.0
102