X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Freadahead%2Freadahead-analyze.c;h=76db3cb7e4b8dc0be437e291d9bf8e3d0c0797cb;hp=6ee355146a3708384893c4a9b7797ef53fcfabd6;hb=3fa5dd6de798e17d93531bc900b8e2dc587c38f3;hpb=cae544bcdb073134bcaa2031aeb1f1705030046e diff --git a/src/readahead/readahead-analyze.c b/src/readahead/readahead-analyze.c index 6ee355146..76db3cb7e 100644 --- a/src/readahead/readahead-analyze.c +++ b/src/readahead/readahead-analyze.c @@ -32,52 +32,46 @@ #include "readahead-common.h" - -int main(int argc, char *argv[]) -{ - char line[1024]; - char path[PATH_MAX]; - FILE *pack; +int main_analyze(const char *pack_path) { + char line[LINE_MAX]; + _cleanup_fclose_ FILE *pack = NULL; int a; int missing = 0; - off_t size; - long tsize = 0; - uint64_t inode; - uint32_t b; - uint32_t c; - struct stat st; - int pagesize = getpagesize(); - - if (argc != 2) - snprintf(path, PATH_MAX, "/.readahead"); - else - snprintf(path, PATH_MAX, "%s", argv[1]); - - pack = fopen(path, "r"); + size_t tsize = 0; + + if (!pack_path) + pack_path = "/.readahead"; + + pack = fopen(pack_path, "re"); if (!pack) { - fprintf(stderr, "Pack file missing\n"); - exit(EXIT_FAILURE); + log_error("Pack file missing."); + goto fail; } - if (!(fgets(line, sizeof(line), pack))) { - fprintf(stderr, "Pack file corrupt\n"); - exit(EXIT_FAILURE); + if (!fgets(line, sizeof(line), pack)) { + log_error("Pack file corrupt."); + goto fail; } - if (!strstr(line, READAHEAD_PACK_FILE_VERSION)) { - fprintf(stderr, "Pack file version incompatible with this parser\n"); - exit(EXIT_FAILURE); + char_array_0(line); + + if (!endswith(line, READAHEAD_PACK_FILE_VERSION)) { + log_error("Pack file version incompatible with this parser."); + goto fail; } if ((a = getc(pack)) == EOF) { - fprintf(stderr, "Pack file corrupt\n"); - exit(EXIT_FAILURE); + log_error("Pack file corrupt."); + goto fail; } - fprintf(stdout, " pct sections size: path\n"); - fprintf(stdout, " === ======== ====: ====\n"); + fputs(" pct sections size: path\n" + " === ======== ====: ====\n", stdout); - while(true) { + for (;;) { + char path[PATH_MAX]; + struct stat st; + uint64_t inode; int pages = 0; int sections = 0; @@ -87,21 +81,23 @@ int main(int argc, char *argv[]) path[strlen(path)-1] = 0; if (fread(&inode, sizeof(inode), 1, pack) != 1) { - fprintf(stderr, "Pack file corrupt\n"); - exit(EXIT_FAILURE); + log_error("Pack file corrupt."); + goto fail; } - while (true) { + for (;;) { + uint32_t b, c; + if (fread(&b, sizeof(b), 1, pack) != 1 || fread(&c, sizeof(c), 1, pack) != 1) { - fprintf(stderr, "Pack file corrupt\n"); - exit(EXIT_FAILURE); + log_error("Pack file corrupt."); + goto fail; } if ((b == 0) && (c == 0)) break; /* Uncomment this to get all the chunks separately - fprintf(stdout, " %d: %d %d\n", sections, b, c); + printf(" %d: %d %d\n", sections, b, c); */ pages += (c - b); @@ -109,20 +105,22 @@ int main(int argc, char *argv[]) } if (stat(path, &st) == 0) { + off_t size; + if (sections == 0) size = st.st_size; else - size = pages * pagesize; + size = pages * page_size(); tsize += size; - fprintf(stdout, " %4d%% (%2d) %12ld: %s\n", - sections ? (int)(size / st.st_size * 100.0) : 100, - sections ? sections : 1, - (unsigned long)size, - path); + printf(" %4jd%% (%2d) %12jd: %s\n", + (intmax_t) (sections && st.st_size ? size * 100 / st.st_size : 100), + sections ? sections : 1, + (intmax_t) size, + path); } else { - fprintf(stdout, " %4dp (%2d) %12s: %s (MISSING)\n", + printf(" %4dp (%2d) %12s: %s (MISSING)\n", sections ? pages : -1, sections ? sections : 1, "???", @@ -132,10 +130,17 @@ int main(int argc, char *argv[]) } - fprintf(stdout, "\nHOST: %s", line); - fprintf(stdout, "TYPE: %c\n", a); - fprintf(stdout, "MISSING: %d\n", missing); - fprintf(stdout, "TOTAL: %ld\n", tsize); + printf("\nHOST: %s" + "TYPE: %c\n" + "MISSING: %d\n" + "TOTAL: %zu\n", + line, + a, + missing, + tsize); + + return EXIT_SUCCESS; - exit(EXIT_SUCCESS); +fail: + return EXIT_FAILURE; }