diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2000-09-10 01:54:27 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2000-09-10 01:54:27 +0000 |
commit | 0ae8e5a645d9fba1623a370ec51b9008c6d1bc7c (patch) | |
tree | ac7ace19652f72fd2bae22c735f5c23b93a1b7a9 /coreutils | |
parent | bd7c67136ac961f4dd8b06514ca00de900cd1f8c (diff) | |
download | busybox-0ae8e5a645d9fba1623a370ec51b9008c6d1bc7c.tar.gz |
My previous attempt to make dd use fullRead, fullWrite was very broken,
this should actually work.
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/dd.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c index 787e5da95..395f8c1e3 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -52,9 +52,11 @@ extern int dd_main(int argc, char **argv) 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; + uintmax_t readSize; + unsigned char buf[BUFSIZ]; argc--; argv++; @@ -98,11 +100,6 @@ extern int dd_main(int argc, char **argv) argv++; } - buf = xmalloc(blockSize); - - intotal = 0; - outTotal = 0; - if (inFile == NULL) inFd = fileno(stdin); else @@ -134,9 +131,13 @@ extern int dd_main(int argc, char **argv) lseek(inFd, skipBlocks * blockSize, SEEK_SET); lseek(outFd, seekBlocks * blockSize, SEEK_SET); - - while ((inCc = read(inFd, buf, sizeof(buf))) > 0) { - intotal +=inCc; + totalSize=count*blockSize; + printf("totalsize is %d\n",(int) totalSize); + while ((readSize = totalSize - inTotal) > 0) { + if (readSize > BUFSIZ) + readSize=BUFSIZ; + inCc = read(inFd, buf, readSize); + inTotal += inCc; if ((outCc = fullWrite(outFd, buf, inCc)) < 0) break; outTotal += outCc; @@ -150,8 +151,8 @@ extern int dd_main(int argc, char **argv) free(buf); #endif - printf("%ld+%d records in\n", (long) (intotal / blockSize), - (intotal % blockSize) != 0); + printf("%ld+%d records in\n", (long) (inTotal / blockSize), + (inTotal % blockSize) != 0); printf("%ld+%d records out\n", (long) (outTotal / blockSize), (outTotal % blockSize) != 0); exit(TRUE); |