From 0ae8e5a645d9fba1623a370ec51b9008c6d1bc7c Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Sun, 10 Sep 2000 01:54:27 +0000 Subject: My previous attempt to make dd use fullRead, fullWrite was very broken, this should actually work. --- dd.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'dd.c') diff --git a/dd.c b/dd.c index 787e5da95..395f8c1e3 100644 --- a/dd.c +++ b/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); -- cgit v1.2.3