]>
Commit | Line | Data |
---|---|---|
c854115a WB |
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 876a3623a7..2605367c59 100644 | |
18 | --- a/qemu-img.c | |
19 | +++ b/qemu-img.c | |
20 | @@ -4089,11 +4089,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 | @@ -4186,6 +4188,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 | @@ -4200,12 +4216,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 | @@ -4227,6 +4245,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 | @@ -4433,14 +4452,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 |