aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-05 22:15:31 +0200
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-04-20 19:14:24 +0200
commitdd364c383a18fa5ef2f99a1cb26c5dd6dbfb31da (patch)
tree32531f274202c39ea420e820c6521f7b266137b4
parent1707ca754228f8d78d514a619f9e5eba2f51c5ee (diff)
downloadbusybox-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.c20
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 }