aboutsummaryrefslogtreecommitdiff
path: root/coreutils/dd.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils/dd.c')
-rw-r--r--coreutils/dd.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index fc8b1dbb2..042355e24 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -466,6 +466,27 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
466 466
467 xmove_fd(xopen(outfile, oflag), ofd); 467 xmove_fd(xopen(outfile, oflag), ofd);
468 468
469#if ENABLE_PLATFORM_MINGW32
470 {
471 off_t len = (off_t)seek * ((G.flags & FLAG_SEEK_BYTES) ? 1 : obs);
472 struct stat st;
473 int ret = fstat(ofd, &st);
474
475 if (ret == 0 && !(G.flags & FLAG_APPEND) && len > st.st_size)
476 make_sparse(ofd, st.st_size, len);
477
478 if (seek && !(G.flags & FLAG_NOTRUNC)) {
479 if (ftruncate(ofd, len) < 0) {
480 if (ret < 0
481 || S_ISREG(st.st_mode)
482 || S_ISDIR(st.st_mode)
483 ) {
484 goto die_outfile;
485 }
486 }
487 }
488 }
489#else
469 if (seek && !(G.flags & FLAG_NOTRUNC)) { 490 if (seek && !(G.flags & FLAG_NOTRUNC)) {
470 size_t blocksz = (G.flags & FLAG_SEEK_BYTES) ? 1 : obs; 491 size_t blocksz = (G.flags & FLAG_SEEK_BYTES) ? 1 : obs;
471 if (ftruncate(ofd, seek * blocksz) < 0) { 492 if (ftruncate(ofd, seek * blocksz) < 0) {
@@ -479,6 +500,7 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
479 } 500 }
480 } 501 }
481 } 502 }
503#endif
482 } else { 504 } else {
483 outfile = bb_msg_standard_output; 505 outfile = bb_msg_standard_output;
484 } 506 }
@@ -502,9 +524,6 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
502 } 524 }
503 if (seek) { 525 if (seek) {
504 size_t blocksz = (G.flags & FLAG_SEEK_BYTES) ? 1 : obs; 526 size_t blocksz = (G.flags & FLAG_SEEK_BYTES) ? 1 : obs;
505#if ENABLE_PLATFORM_MINGW32
506 seek_sparse(ofd, seek * blocksz);
507#endif
508 if (lseek(ofd, seek * blocksz, SEEK_CUR) < 0) 527 if (lseek(ofd, seek * blocksz, SEEK_CUR) < 0)
509 goto die_outfile; 528 goto die_outfile;
510 } 529 }