summaryrefslogtreecommitdiff
path: root/dd.c
diff options
context:
space:
mode:
authorMatt Kraai2001-01-17 00:21:05 +0000
committerMatt Kraai2001-01-17 00:21:05 +0000
commitc9acf8c766a9a2cc00449db5dea506d7663ad26b (patch)
treeaf94dcea7206980094332a1131dd244983d9759b /dd.c
parentfd4c58d7c5a8cd8dd72ea5fc4eb16828be998792 (diff)
downloadbusybox-c9acf8c766a9a2cc00449db5dea506d7663ad26b.zip
busybox-c9acf8c766a9a2cc00449db5dea506d7663ad26b.tar.gz
Complicate truncate behavior.
Diffstat (limited to 'dd.c')
-rw-r--r--dd.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/dd.c b/dd.c
index a0d2330..32eeb66 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)