From ddea368dbe50bd9bb3ca129037aa4ca1e28515ed Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 29 Nov 2000 22:33:02 +0000 Subject: [PATCH] Apply rev #2 of dd fix from Gennady Feldman. --- applets/usage.c | 3 ++- coreutils/dd.c | 28 +++++++++++++++++++++------- dd.c | 28 +++++++++++++++++++++------- usage.c | 3 ++- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/applets/usage.c b/applets/usage.c index a919a58f7..bab6d21b3 100644 --- a/applets/usage.c +++ b/applets/usage.c @@ -161,7 +161,7 @@ const char dc_usage[] = #if defined BB_DD const char dd_usage[] = - "dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N] [seek=N]\n" + "dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N] [seek=N] [conv=notrunc|sync]\n" #ifndef BB_FEATURE_TRIVIAL_HELP "\nCopy a file, converting and formatting according to options\n\n" "\tif=FILE\tread from FILE instead of stdin\n" @@ -171,6 +171,7 @@ const char dd_usage[] = "\tskip=N\tskip N input blocks\n" "\tseek=N\tskip N output blocks\n" "\tconv=notrunc\t dont truncate of at end of write\n" + "\tconv=sync\t pad the last block with zeros until blocksize\n" "\n" "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n" #endif diff --git a/coreutils/dd.c b/coreutils/dd.c index 6868a913e..2b77ea6a5 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -49,14 +49,15 @@ extern int dd_main(int argc, char **argv) int inCc = 0; int outCc; int trunc=TRUE; - long blockSize = 512; + int sync=FALSE; + long blockSize = 512,ibs; uintmax_t skipBlocks = 0; uintmax_t seekBlocks = 0; uintmax_t count = (uintmax_t) - 1; uintmax_t inTotal = 0; uintmax_t outTotal = 0; uintmax_t totalSize; - uintmax_t readSize; + unsigned char buf[BUFSIZ]; char *keyword = NULL; @@ -98,6 +99,8 @@ extern int dd_main(int argc, char **argv) keyword = (strchr(*argv, '=') + 1); if (strcmp(keyword, "notrunc") == 0) trunc=FALSE; + if (strcmp(keyword, "sync") == 0) + sync=TRUE; } else { goto usage; } @@ -137,13 +140,24 @@ extern int dd_main(int argc, char **argv) lseek(inFd, (off_t) (skipBlocks * blockSize), SEEK_SET); lseek(outFd, (off_t) (seekBlocks * blockSize), SEEK_SET); totalSize=count*blockSize; - while ((readSize = totalSize - inTotal) > 0) { - if (readSize > BUFSIZ) - readSize=BUFSIZ; - inCc = fullRead(inFd, buf, readSize); + + ibs=blockSize; + if (ibs > BUFSIZ) + ibs=BUFSIZ; + + while (totalSize > outTotal) { + inCc = fullRead(inFd, buf, ibs); inTotal += inCc; - if ((outCc = fullWrite(outFd, buf, inCc)) < 1) + if ( (sync==TRUE) && (inCc>0) ) + while (inCc