summaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorGlenn L McGrath2000-09-10 01:54:27 +0000
committerGlenn L McGrath2000-09-10 01:54:27 +0000
commit0ae8e5a645d9fba1623a370ec51b9008c6d1bc7c (patch)
treeac7ace19652f72fd2bae22c735f5c23b93a1b7a9 /coreutils
parentbd7c67136ac961f4dd8b06514ca00de900cd1f8c (diff)
downloadbusybox-0ae8e5a645d9fba1623a370ec51b9008c6d1bc7c.zip
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.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index 787e5da..395f8c1 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);