From c9acf8c766a9a2cc00449db5dea506d7663ad26b Mon Sep 17 00:00:00 2001 From: Matt Kraai Date: Wed, 17 Jan 2001 00:21:05 +0000 Subject: [PATCH] Complicate truncate behavior. --- coreutils/dd.c | 20 +++++++++++++------- dd.c | 20 +++++++++++++------- 2 files changed, 26 insertions(+), 14 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) diff --git a/dd.c b/dd.c index a0d2330ea..32eeb661c 100644 --- a/dd.c +++ b/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)