From 86142001d8ef967528d5f9f4b585e85936c9c228 Mon Sep 17 00:00:00 2001 From: Nguyễn Thái Ngọc Duy Date: Wed, 22 Apr 2009 22:29:41 +1000 Subject: coreutils/dd: support /dev/zero --- coreutils/dd.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/coreutils/dd.c b/coreutils/dd.c index ba3afeae8..5b0119d25 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -109,6 +109,7 @@ int dd_main(int argc, char **argv) ssize_t n, w; off_t seek = 0, skip = 0, count = OFF_T_MAX; int ifd, ofd; + int devzero = 0; const char *infile = NULL, *outfile = NULL; char *ibuf, *obuf; @@ -211,7 +212,13 @@ int dd_main(int argc, char **argv) obuf = xmalloc(obs); } if (infile != NULL) - ifd = xopen(infile, O_RDONLY); + if (!strcmp(infile, "/dev/zero")) { + flags |= NOERROR; + devzero = 1; + ifd = -1; + } + else + ifd = xopen(infile, O_RDONLY); else { ifd = STDIN_FILENO; infile = bb_msg_standard_input; @@ -262,7 +269,8 @@ int dd_main(int argc, char **argv) if (n < 0) { if (flags & NOERROR) { n = ibs; - bb_perror_msg("%s", infile); + if (!devzero) + bb_perror_msg("%s", infile); } else goto die_infile; } @@ -302,7 +310,7 @@ int dd_main(int argc, char **argv) if (w > 0) G.out_part++; } - if (close(ifd) < 0) { + if (!devzero && close(ifd) < 0) { die_infile: bb_perror_msg_and_die("%s", infile); } -- cgit v1.2.3-55-g6feb