Complicate truncate behavior.

This commit is contained in:
Matt Kraai 2001-01-17 00:21:05 +00:00
parent fd4c58d7c5
commit c9acf8c766
2 changed files with 26 additions and 14 deletions

View 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)

20
dd.c
View 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)