X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=dd.c;h=2b77ea6a587a6882275f54310fa869eecd8f573f;hb=8c725e624a6fa97175f48e0fc34b37403e3b8613;hp=6261dfef57dc48f529f4ce4bcab478599557b7c0;hpb=d537a95fdbc0b4a5f38edea8593b4c085fdd7fcb;p=oweals%2Fbusybox.git diff --git a/dd.c b/dd.c index 6261dfef5..2b77ea6a5 100644 --- a/dd.c +++ b/dd.c @@ -29,7 +29,7 @@ */ -#include "internal.h" +#include "busybox.h" #include #include #include @@ -40,39 +40,26 @@ typedef unsigned long long int uintmax_t; #endif -static const char dd_usage[] = - "dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N] [seek=N]\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" - "\tof=FILE\twrite to FILE instead of stdout\n" - "\tbs=N\tread and write N bytes at a time\n" - "\tcount=N\tcopy only N input blocks\n" - "\tskip=N\tskip N input blocks\n" - "\tseek=N\tskip N output blocks\n" - "\n" - "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n" -#endif - ; - - - extern int dd_main(int argc, char **argv) { char *inFile = NULL; char *outFile = NULL; - char *cp; int inFd; int outFd; int inCc = 0; int outCc; - long blockSize = 512; + int trunc=TRUE; + int sync=FALSE; + long blockSize = 512,ibs; uintmax_t skipBlocks = 0; uintmax_t seekBlocks = 0; uintmax_t count = (uintmax_t) - 1; - uintmax_t intotal; - uintmax_t outTotal; - unsigned char *buf; + uintmax_t inTotal = 0; + uintmax_t outTotal = 0; + uintmax_t totalSize; + + unsigned char buf[BUFSIZ]; + char *keyword = NULL; argc--; argv++; @@ -85,7 +72,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; } @@ -108,7 +95,12 @@ 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; + if (strcmp(keyword, "sync") == 0) + sync=TRUE; } else { goto usage; } @@ -116,11 +108,6 @@ extern int dd_main(int argc, char **argv) argv++; } - buf = xmalloc(blockSize); - - intotal = 0; - outTotal = 0; - if (inFile == NULL) inFd = fileno(stdin); else @@ -132,13 +119,13 @@ extern int dd_main(int argc, char **argv) * here anyways... */ /* free(buf); */ - fatalError( inFile); + fatalPerror("%s", inFile); } if (outFile == NULL) outFd = fileno(stdout); else - outFd = open(outFile, O_WRONLY | O_CREAT | O_TRUNC, 0666); + outFd = open(outFile, O_WRONLY | O_CREAT, 0666); if (outFd < 0) { /* Note that we are not freeing buf or closing @@ -147,57 +134,44 @@ extern int dd_main(int argc, char **argv) /* close(inFd); free(buf); */ - fatalError( outFile); + fatalPerror("%s", outFile); } - lseek(inFd, skipBlocks * blockSize, SEEK_SET); - lseek(outFd, seekBlocks * blockSize, SEEK_SET); - // - //TODO: Convert to using fullRead & fullWrite - // from utility.c - // -Erik - while (outTotal < count * blockSize) { - inCc = read(inFd, buf, blockSize); - if (inCc < 0) { - perror(inFile); - goto cleanup; - } else if (inCc == 0) { - goto cleanup; - } - intotal += inCc; - cp = buf; - - while (intotal > outTotal) { - if (outTotal + inCc > count * blockSize) - inCc = count * blockSize - outTotal; - outCc = write(outFd, cp, inCc); - if (outCc < 0) { - perror(outFile); - goto cleanup; - } else if (outCc == 0) { - goto cleanup; + lseek(inFd, (off_t) (skipBlocks * blockSize), SEEK_SET); + lseek(outFd, (off_t) (seekBlocks * blockSize), SEEK_SET); + totalSize=count*blockSize; + + ibs=blockSize; + if (ibs > BUFSIZ) + ibs=BUFSIZ; + + while (totalSize > outTotal) { + inCc = fullRead(inFd, buf, ibs); + inTotal += inCc; + if ( (sync==TRUE) && (inCc>0) ) + while (inCc