X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/agedu/blobdiff_plain/14601b5d4222f2bee568e03eddf2f949b2a9d126..cf39b58867b4e3ecc99af144820873b145946e86:/agedu.c diff --git a/agedu.c b/agedu.c index 50affaa..9ff6bb8 100644 --- a/agedu.c +++ b/agedu.c @@ -140,6 +140,24 @@ static int gotdata(void *vctx, const char *pathname, const STRUCT_STAT *st) return 1; } +static void scan_error(void *vctx, const char *fmt, ...) +{ + struct ctx *ctx = (struct ctx *)vctx; + va_list ap; + + if (ctx->progress) { + fprintf(stderr, "%-*s\r", ctx->progwidth, ""); + fflush(stderr); + } + + fprintf(stderr, "%s: ", PNAME); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + ctx->last_output_update--; /* force a progress report next time */ +} + static void text_query(const void *mappedfile, const char *querydir, time_t t, int depth) { @@ -302,8 +320,6 @@ static void text_query(const void *mappedfile, const char *querydir, HELPOPT("[--scan,--load] fake atimes on directories") \ NOVAL(MTIME) LONG(mtime) \ HELPOPT("[--scan] use mtime instead of atime") \ - NOVAL(FULL) LONG(full_index) \ - HELPOPT("[--scan] index every file individually") \ VAL(AGERANGE) SHORT(r) LONG(age_range) LONG(range) LONG(ages) \ HELPARG("age[-age]") HELPOPT("[--web,--html] set limits of colour coding") \ VAL(SERVERADDR) LONG(address) LONG(addr) LONG(server_address) \ @@ -466,7 +482,6 @@ int main(int argc, char **argv) int tqdepth = 1; int fakediratimes = 1; int mtime = 0; - int fullindex = 0; #ifdef DEBUG_MAD_OPTION_PARSING_MACROS { @@ -720,9 +735,6 @@ int main(int argc, char **argv) case OPT_MTIME: mtime = 1; break; - case OPT_FULL: - fullindex = 1; - break; case OPT_DATAFILE: filename = optval; break; @@ -937,7 +949,9 @@ int main(int argc, char **argv) ctx->progress = progress; { struct winsize ws; - if (progress && ioctl(2, TIOCGWINSZ, &ws) == 0) + if (progress && + ioctl(2, TIOCGWINSZ, &ws) == 0 && + ws.ws_col > 0) ctx->progwidth = ws.ws_col - 1; else ctx->progwidth = 79; @@ -1012,10 +1026,11 @@ int main(int argc, char **argv) line++; } } else { - du(scandir, gotdata, ctx); + du(scandir, gotdata, scan_error, ctx); } if (mode != SCANDUMP) { size_t maxpathlen; + size_t delta; char *buf, *prevbuf; count = triebuild_finish(ctx->tb); @@ -1035,10 +1050,12 @@ int main(int argc, char **argv) return 1; } - printf("Built pathname index, %d entries, %llu bytes\n", count, + printf("Built pathname index, %d entries," + " %llu bytes of index\n", count, (unsigned long long)st.st_size); - totalsize = index_compute_size(st.st_size, count); + totalsize = index_initial_size(st.st_size, count); + totalsize += totalsize / 10; if (lseek(fd, totalsize-1, SEEK_SET) < 0) { perror(PNAME ": lseek"); @@ -1049,9 +1066,6 @@ int main(int argc, char **argv) return 1; } - printf("Upper bound on index file size = %llu bytes\n", - (unsigned long long)totalsize); - mappedfile = mmap(NULL, totalsize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0); if (!mappedfile) { perror(PNAME ": mmap"); @@ -1064,7 +1078,7 @@ int main(int argc, char **argv) } printf("Building index\n"); - ib = indexbuild_new(mappedfile, st.st_size, count); + ib = indexbuild_new(mappedfile, st.st_size, count, &delta); maxpathlen = trie_maxpathlen(mappedfile); buf = snewn(maxpathlen, char); prevbuf = snewn(maxpathlen, char); @@ -1075,6 +1089,45 @@ int main(int argc, char **argv) while (1) { int i; + if (totalsize - indexbuild_realsize(ib) < delta) { + const void *oldfile = mappedfile; + ptrdiff_t diff; + + /* + * Unmap the file, grow it, and remap it. + */ + munmap(mappedfile, totalsize); + + totalsize += delta; + totalsize += totalsize / 10; + + if (lseek(fd, totalsize-1, SEEK_SET) < 0) { + perror(PNAME ": lseek"); + return 1; + } + if (write(fd, "\0", 1) < 1) { + perror(PNAME ": write"); + return 1; + } + + mappedfile = mmap(NULL, totalsize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0); + if (!mappedfile) { + perror(PNAME ": mmap"); + return 1; + } + + indexbuild_rebase(ib, mappedfile); + triewalk_rebase(tw, mappedfile); + diff = (const unsigned char *)mappedfile - + (const unsigned char *)oldfile; + if (prevtf) + prevtf = (const struct trie_file *) + (((const unsigned char *)prevtf) + diff); + if (tf) + tf = (const struct trie_file *) + (((const unsigned char *)tf) + diff); + } + /* * Get the next file from the index. So we are * currently holding, and have not yet @@ -1118,12 +1171,6 @@ int main(int argc, char **argv) indexbuild_tag(ib); break; } - - /* - * In full-index mode, index everything. - */ - if (fullindex) - indexbuild_tag(ib); /* * If prevbuf was a filename inside some @@ -1144,7 +1191,7 @@ int main(int argc, char **argv) munmap(mappedfile, totalsize); ftruncate(fd, realsize); close(fd); - printf("Actual index file size = %llu bytes\n", + printf("Final index file size = %llu bytes\n", (unsigned long long)realsize); } } else if (mode == TEXT) {