diff options
Diffstat (limited to 'coreutils/dd.c')
-rw-r--r-- | coreutils/dd.c | 25 |
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 | } |