diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-05 22:15:31 +0200 |
---|---|---|
committer | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-20 19:14:24 +0200 |
commit | dd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da (patch) | |
tree | 32531f274202c39ea420e820c6521f7b266137b4 | |
parent | 1707ca754228f8d78d514a619f9e5eba2f51c5ee (diff) | |
download | busybox-w32-dd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da.tar.gz busybox-w32-dd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da.tar.bz2 busybox-w32-dd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da.zip |
win32: dd: support if=/dev/zero on Windows
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
-rw-r--r-- | coreutils/dd.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c index 7c1a0c0df..eb9f8885f 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c | |||
@@ -168,6 +168,7 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
168 | #endif | 168 | #endif |
169 | }; | 169 | }; |
170 | int exitcode = EXIT_FAILURE; | 170 | int exitcode = EXIT_FAILURE; |
171 | int devzero = 0; | ||
171 | size_t ibs = 512, obs = 512; | 172 | size_t ibs = 512, obs = 512; |
172 | ssize_t n, w; | 173 | ssize_t n, w; |
173 | char *ibuf, *obuf; | 174 | char *ibuf, *obuf; |
@@ -285,7 +286,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
285 | #endif | 286 | #endif |
286 | 287 | ||
287 | if (infile != NULL) | 288 | if (infile != NULL) |
288 | xmove_fd(xopen(infile, O_RDONLY), ifd); | 289 | if (ENABLE_PLATFORM_MINGW32 && !strcmp(infile, "/dev/zero")) { |
290 | flags |= FLAG_NOERROR; | ||
291 | devzero = 1; | ||
292 | } | ||
293 | else | ||
294 | xmove_fd(xopen(infile, O_RDONLY), ifd); | ||
289 | else { | 295 | else { |
290 | infile = bb_msg_standard_input; | 296 | infile = bb_msg_standard_input; |
291 | } | 297 | } |
@@ -312,7 +318,7 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
312 | } else { | 318 | } else { |
313 | outfile = bb_msg_standard_output; | 319 | outfile = bb_msg_standard_output; |
314 | } | 320 | } |
315 | if (skip) { | 321 | if (skip && !devzero) { |
316 | if (lseek(ifd, skip * ibs, SEEK_CUR) < 0) { | 322 | if (lseek(ifd, skip * ibs, SEEK_CUR) < 0) { |
317 | while (skip-- > 0) { | 323 | while (skip-- > 0) { |
318 | n = safe_read(ifd, ibuf, ibs); | 324 | n = safe_read(ifd, ibuf, ibs); |
@@ -329,7 +335,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
329 | } | 335 | } |
330 | 336 | ||
331 | while (!(flags & FLAG_COUNT) || (G.in_full + G.in_part != count)) { | 337 | while (!(flags & FLAG_COUNT) || (G.in_full + G.in_part != count)) { |
332 | n = safe_read(ifd, ibuf, ibs); | 338 | if (devzero) { |
339 | memset(ibuf, 0, ibs); | ||
340 | n = ibs; | ||
341 | } | ||
342 | else | ||
343 | n = safe_read(ifd, ibuf, ibs); | ||
333 | if (n == 0) | 344 | if (n == 0) |
334 | break; | 345 | break; |
335 | if (n < 0) { | 346 | if (n < 0) { |
@@ -383,7 +394,8 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
383 | if (w < 0) goto out_status; | 394 | if (w < 0) goto out_status; |
384 | if (w > 0) G.out_part++; | 395 | if (w > 0) G.out_part++; |
385 | } | 396 | } |
386 | if (close(ifd) < 0) { | 397 | |
398 | if (!devzero && close(ifd) < 0) { | ||
387 | die_infile: | 399 | die_infile: |
388 | bb_simple_perror_msg_and_die(infile); | 400 | bb_simple_perror_msg_and_die(infile); |
389 | } | 401 | } |