Complicate truncate behavior.
authorMatt Kraai <kraai@debian.org>
Wed, 17 Jan 2001 00:21:05 +0000 (00:21 -0000)
committerMatt Kraai <kraai@debian.org>
Wed, 17 Jan 2001 00:21:05 +0000 (00:21 -0000)
coreutils/dd.c
dd.c

index a0d2330ea6511d47f2c15f1bedc260299e93ed8b..32eeb661cf3aaef32a9f4c961e589d6c0d4b3739 100644 (file)
@@ -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 a0d2330ea6511d47f2c15f1bedc260299e93ed8b..32eeb661cf3aaef32a9f4c961e589d6c0d4b3739 100644 (file)
--- 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)