From dd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da Mon Sep 17 00:00:00 2001 From: Nguyễn Thái Ngọc Duy Date: Mon, 5 Apr 2010 22:15:31 +0200 Subject: win32: dd: support if=/dev/zero on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nguyễn Thái Ngọc Duy --- coreutils/dd.c | 20 ++++++++++++++++---- 1 file 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) #endif }; int exitcode = EXIT_FAILURE; + int devzero = 0; size_t ibs = 512, obs = 512; ssize_t n, w; char *ibuf, *obuf; @@ -285,7 +286,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv) #endif if (infile != NULL) - xmove_fd(xopen(infile, O_RDONLY), ifd); + if (ENABLE_PLATFORM_MINGW32 && !strcmp(infile, "/dev/zero")) { + flags |= FLAG_NOERROR; + devzero = 1; + } + else + xmove_fd(xopen(infile, O_RDONLY), ifd); else { infile = bb_msg_standard_input; } @@ -312,7 +318,7 @@ int dd_main(int argc UNUSED_PARAM, char **argv) } else { outfile = bb_msg_standard_output; } - if (skip) { + if (skip && !devzero) { if (lseek(ifd, skip * ibs, SEEK_CUR) < 0) { while (skip-- > 0) { n = safe_read(ifd, ibuf, ibs); @@ -329,7 +335,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv) } while (!(flags & FLAG_COUNT) || (G.in_full + G.in_part != count)) { - n = safe_read(ifd, ibuf, ibs); + if (devzero) { + memset(ibuf, 0, ibs); + n = ibs; + } + else + n = safe_read(ifd, ibuf, ibs); if (n == 0) break; if (n < 0) { @@ -383,7 +394,8 @@ int dd_main(int argc UNUSED_PARAM, char **argv) if (w < 0) goto out_status; if (w > 0) G.out_part++; } - if (close(ifd) < 0) { + + if (!devzero && close(ifd) < 0) { die_infile: bb_simple_perror_msg_and_die(infile); } -- cgit v1.2.3-55-g6feb