summaryrefslogtreecommitdiff
path: root/dd.c
diff options
context:
space:
mode:
authorGlenn L McGrath2000-09-11 00:32:13 +0000
committerGlenn L McGrath2000-09-11 00:32:13 +0000
commitf0b073f55ac00a87c38e4e7aa66ee3543564779b (patch)
tree5a2024cd2cf880f4e4b861acab636e11bc14d5b7 /dd.c
parentde34e4375565cbe1b60c2d99afddfb6c7c45b3ad (diff)
downloadbusybox-f0b073f55ac00a87c38e4e7aa66ee3543564779b.zip
busybox-f0b073f55ac00a87c38e4e7aa66ee3543564779b.tar.gz
dd now truncates files at the end its write, this can be turned of by
specifying conv=notrunc in the command line This conforms to GNU dd behaviour
Diffstat (limited to 'dd.c')
-rw-r--r--dd.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/dd.c b/dd.c
index 84f3211..5ab0a90 100644
--- a/dd.c
+++ b/dd.c
@@ -48,6 +48,7 @@ extern int dd_main(int argc, char **argv)
int outFd;
int inCc = 0;
int outCc;
+ int trunc=TRUE;
long blockSize = 512;
uintmax_t skipBlocks = 0;
uintmax_t seekBlocks = 0;
@@ -57,6 +58,7 @@ extern int dd_main(int argc, char **argv)
uintmax_t totalSize;
uintmax_t readSize;
unsigned char buf[BUFSIZ];
+ char *keyword = NULL;
argc--;
argv++;
@@ -69,7 +71,7 @@ extern int dd_main(int argc, char **argv)
outFile = ((strchr(*argv, '=')) + 1);
else if (strncmp("count", *argv, 5) == 0) {
count = getNum((strchr(*argv, '=')) + 1);
- if (count <= 0) {
+ if (count < 0) {
errorMsg("Bad count value %s\n", *argv);
goto usage;
}
@@ -92,7 +94,10 @@ extern int dd_main(int argc, char **argv)
errorMsg("Bad seek value %s\n", *argv);
goto usage;
}
-
+ } else if (strncmp(*argv, "conv", 4) == 0) {
+ keyword = (strchr(*argv, '=') + 1);
+ if (strcmp(keyword, "notrunc") == 0)
+ trunc=FALSE;
} else {
goto usage;
}
@@ -141,7 +146,9 @@ extern int dd_main(int argc, char **argv)
break;
outTotal += outCc;
}
-
+ if (trunc == TRUE) {
+ ftruncate(outFd, lseek(outFd, 0, SEEK_CUR));
+ }
/* Note that we are not freeing memory or closing
* files here, to save a few bytes. */
#ifdef BB_FEATURE_CLEAN_UP