diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/dd.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c index a0d2330ea..32eeb661c 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -41,7 +41,7 @@ static struct suffix_mult dd_suffixes[] = { int dd_main(int argc, char **argv) { - int i, ifd, ofd, sync = FALSE, trunc = TRUE; + int i, ifd, ofd, oflag, sync = FALSE, trunc = TRUE; size_t in_full = 0, in_part = 0, out_full = 0, out_part = 0; size_t bs = 512, count = -1; ssize_t n; @@ -94,8 +94,19 @@ int dd_main(int argc, char **argv) } if (outfile != NULL) { - if ((ofd = open(outfile, O_WRONLY | O_CREAT, 0666)) < 0) + oflag = O_WRONLY | O_CREAT; + + if (!seek && trunc) + oflag |= O_TRUNC; + + if ((ofd = open(outfile, oflag, 0666)) < 0) perror_msg_and_die("%s", outfile); + + if (seek && trunc) { + if (ftruncate(ofd, seek * bs) < 0) + perror_msg_and_die("%s", outfile); + } + statusfp = stdout; } else { ofd = STDOUT_FILENO; @@ -113,11 +124,6 @@ int dd_main(int argc, char **argv) perror_msg_and_die("%s", outfile); } - if (trunc) { - if (ftruncate(ofd, seek * bs) < 0) - perror_msg_and_die("%s", outfile); - } - while (in_full + in_part != count) { n = safe_read(ifd, buf, bs); if (n < 0) |