My previous attempt to make dd use fullRead, fullWrite was very broken,
this should actually work.
This commit is contained in:
parent
bd7c67136a
commit
0ae8e5a645
@ -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);
|
||||
|
27
dd.c
27
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);
|
||||
|
Loading…
Reference in New Issue
Block a user