dd: implement conv=notrunc support

This commit is contained in:
Eivind Uggedal 2016-03-16 09:23:50 +00:00 committed by sin
parent 596663c1b1
commit e0dc3f9546
2 changed files with 9 additions and 4 deletions

2
dd.1
View File

@ -61,4 +61,6 @@ blocks from the beginning of the output before copying.
Skip Skip
.Ar N .Ar N
blocks from the beginning of the input before copying. blocks from the beginning of the input before copying.
.It Ar conv=notrunc
Do not truncate the output file.
.El .El

11
dd.c
View File

@ -32,7 +32,7 @@ struct dd_config {
uint64_t skip, seek, count, b_in, b_out, rec_in, rec_out; uint64_t skip, seek, count, b_in, b_out, rec_in, rec_out;
off_t fsize; off_t fsize;
blksize_t bs; blksize_t bs;
char quiet, nosync, direct; char quiet, nosync, notrunc, direct;
time_t t_start, t_end; time_t t_start, t_end;
}; };
@ -99,7 +99,7 @@ prepare_copy(struct dd_config *ddc, int *ifd, int *ofd)
return -1; return -1;
} }
if (!ddc->seek) if (!ddc->seek && !ddc->notrunc)
flo |= O_TRUNC; flo |= O_TRUNC;
if (!ddc->out) *ofd = 1; if (!ddc->out) *ofd = 1;
@ -108,7 +108,7 @@ prepare_copy(struct dd_config *ddc, int *ifd, int *ofd)
return -1; return -1;
} }
if (ddc->seek) { if (ddc->seek && !ddc->notrunc) {
if (fstat(*ofd, &st) < 0) if (fstat(*ofd, &st) < 0)
return -1; return -1;
if (!S_ISREG(st.st_mode)) if (!S_ISREG(st.st_mode))
@ -238,7 +238,8 @@ static void
usage(void) usage(void)
{ {
eprintf("usage: %s [-h] [if=infile] [of=outfile] [bs[=N]] [seek=N] " eprintf("usage: %s [-h] [if=infile] [of=outfile] [bs[=N]] [seek=N] "
"[skip=N] [count=N] [direct] [quiet] [nosync]\n", argv0); "[skip=N] [count=N] [direct] [quiet] [nosync]"
"[conv=notrunc]\n", argv0);
} }
int int
@ -278,6 +279,8 @@ main(int argc, char *argv[])
config.quiet = 1; config.quiet = 1;
else if (strcmp(argv[i], "nosync") == 0) else if (strcmp(argv[i], "nosync") == 0)
config.nosync = 1; config.nosync = 1;
else if (strcmp(argv[i], "conv=notrunc") == 0)
config.notrunc = 1;
else if (strcmp(argv[i], "-h") == 0) else if (strcmp(argv[i], "-h") == 0)
usage(); usage();
} }