diff --git a/os/imagezip/imageunzip.c b/os/imagezip/imageunzip.c index 1a703963265ae1efba92f174941a78cadbadbed9..3f2d0afef55bc01f03e0bbc2909097dae051e995 100644 --- a/os/imagezip/imageunzip.c +++ b/os/imagezip/imageunzip.c @@ -40,6 +40,8 @@ long long totaledata = 0; long long totalrdata = 0; +int totalchunks, donechunks; + /* * In slice mode, we read the DOS MBR to find out where the slice is on * the raw disk, and then seek to that spot. This avoids sillyness in @@ -176,6 +178,39 @@ unsigned long splits; int fsleep(unsigned int usecs); #endif +void +dump_stats(int sig) +{ + struct timeval estamp; + + gettimeofday(&estamp, 0); + estamp.tv_sec -= stamp.tv_sec; + if (sig == 0 && debug != 1 && dots) { + while (dotcol++ <= 60) + fprintf(stderr, " "); + + fprintf(stderr, "%4ld %13qd\n", estamp.tv_sec, totaledata); + } + else { + if (sig) { + if (dots && dotcol) + fputc('\n', stderr); + if (totalchunks) + fprintf(stderr, "%d of %d chunks decompressed\n", + donechunks, totalchunks); + else + fprintf(stderr, "%d chunks decompressed\n", + donechunks); + } + fprintf(stderr, "Wrote %qd bytes (%qd actual) in %ld seconds\n", + totaledata, totalrdata, estamp.tv_sec); + } + if (debug) + fprintf(stderr, "decompressor blocked: %lu, " + "writer idle: %lu, writes performed: %d\n", + decompblocks, writeridles, rdycount); +} + void dump_writebufs(void) { @@ -413,7 +448,6 @@ main(int argc, char **argv) { int i, ch; extern char build_info[]; - struct timeval estamp; #ifdef NOTHREADS nothreads = 1; @@ -495,10 +529,14 @@ main(int argc, char **argv) } if (strcmp(argv[0], "-")) { + struct stat st; + if ((infd = open(argv[0], O_RDONLY, 0666)) < 0) { perror("opening input file"); exit(1); } + if (fstat(infd, &st) == 0) + totalchunks = st.st_size / SUBBLOCKSIZE; } else infd = fileno(stdin); @@ -555,26 +593,24 @@ main(int argc, char **argv) #ifdef FAKEFRISBEE if (dofrisbee) { - struct stat st; - int numchunks, i; + int i; - if (fstat(infd, &st) < 0) { - fprintf(stderr, "Cannot stat input file\n"); + if (totalchunks == 0) { + fprintf(stderr, "Must have statable input file\n"); exit(1); } - numchunks = st.st_size / SUBBLOCKSIZE; - chunklist = (int *) calloc(numchunks+1, sizeof(*chunklist)); + chunklist = (int *) calloc(totalchunks+1, sizeof(*chunklist)); assert(chunklist != NULL); - for (i = 0; i < numchunks; i++) + for (i = 0; i < totalchunks; i++) chunklist[i] = i; chunklist[i] = -1; srandom((long)(stamp.tv_usec^stamp.tv_sec)); - for (i = 0; i < 50 * numchunks; i++) { - int c1 = random() % numchunks; - int c2 = random() % numchunks; + for (i = 0; i < 50 * totalchunks; i++) { + int c1 = random() % totalchunks; + int c2 = random() % totalchunks; int t1 = chunklist[c1]; int t2 = chunklist[c2]; @@ -585,6 +621,9 @@ main(int argc, char **argv) } #endif +#ifdef SIGINFO + signal(SIGINFO, dump_stats); +#endif while (1) { int count = sizeof(chunkbuf); char *bp = chunkbuf; @@ -620,6 +659,7 @@ main(int argc, char **argv) } if (inflate_subblock(chunkbuf)) break; + donechunks++; } done: close(infd); @@ -631,24 +671,7 @@ main(int argc, char **argv) if (slice && dostype >= 0) fixmbr(slice, dostype); - gettimeofday(&estamp, 0); - estamp.tv_sec -= stamp.tv_sec; - if (debug != 1 && dots) { - while (dotcol++ <= 60) - fprintf(stderr, " "); - - fprintf(stderr, "%4ld %13qd\n", estamp.tv_sec, totaledata); - } - else { - fprintf(stderr, "Wrote %qd bytes (%qd actual) in %ld seconds\n", - totaledata, totalrdata, estamp.tv_sec); - fprintf(stderr, "%lu %lu %d\n", - decompblocks, writeridles, rdycount); - } - if (debug) - fprintf(stderr, "decompressor blocked: %lu, " - "writer idle: %lu, writes performed: %d\n", - decompblocks, writeridles, rdycount); + dump_stats(0); if (docrconly) fprintf(stderr, "%s: CRC=%u\n", argv[0], ~crc); dump_writebufs();