/* Calculate and show size of all installed package files (except ignored ones) */ void show_size(const char *title, Package *plist) { PackingList p; Boolean ign = FALSE; const char *dir = "."; struct stat sb; char tmp[FILENAME_MAX]; unsigned long size = 0; long blksize; int headerlen; char *descr; char *prefix = NULL; descr = getbsize(&headerlen, &blksize); if (!Quiet) { printf("%s%s", InfoPrefix, title); fflush(stdout); } for (p = plist->head; p != NULL; p = p->next) { switch (p->type) { case PLIST_FILE: if (!ign) { snprintf(tmp, FILENAME_MAX, "%s/%s", elide_root(dir), p->name); if (!lstat(tmp, &sb)) { size += sb.st_size; if (Verbose) printf("%lu\t%s\n", (unsigned long) howmany(sb.st_size, blksize), tmp); } } ign = FALSE; break; case PLIST_CWD: if (!prefix) prefix = p->name; if (p->name == NULL) dir = prefix; else dir = p->name; break; case PLIST_IGNORE: ign = TRUE; break; /* Silence GCC in the -Wall mode */ default: break; } } if (!Quiet) printf("%lu\t(%s)\n", howmany(size, blksize), descr); else if (UseBlkSz) printf("%lu\n", howmany(size, blksize)); else printf("%lu\n", size); }
/* Show files that don't match the recorded checksum */ int show_cksum(const char *title, Package *plist) { PackingList p; const char *dir = "."; char *prefix = NULL; char tmp[FILENAME_MAX]; int errcode = 0; if (!Quiet) { printf("%s%s", InfoPrefix, title); fflush(stdout); } for (p = plist->head; p != NULL; p = p->next) if (p->type == PLIST_CWD) { if (!prefix) prefix = p->name; if (p->name == NULL) dir = prefix; else dir = p->name; } else if (p->type == PLIST_FILE) { snprintf(tmp, FILENAME_MAX, "%s/%s", elide_root(dir), p->name); if (!fexists(tmp)) { warnx("%s doesn't exist", tmp); errcode = 1; } else if (p->next && p->next->type == PLIST_COMMENT && (strncmp(p->next->name, "MD5:", 4) == 0)) { char *cp = NULL, buf[33]; /* * For packing lists whose version is 1.1 or greater, the md5 * hash for a symlink is calculated on the string returned * by readlink(). */ if (issymlink(tmp) && verscmp(plist, 1, 0) > 0) { int len; char linkbuf[FILENAME_MAX]; if ((len = readlink(tmp, linkbuf, FILENAME_MAX)) > 0) cp = MD5Data((unsigned char *)linkbuf, len, buf); } else if (isfile(tmp) || verscmp(plist, 1, 1) < 0) cp = MD5File(tmp, buf); if (cp != NULL) { /* Mismatch? */ if (strcmp(cp, p->next->name + 4)) printf("%s fails the original MD5 checksum\n", tmp); else if (Verbose) printf("%s matched the original MD5 checksum\n", tmp); } } } return (errcode); }
/* Show all files in the packing list (except ignored ones) */ void show_files(const char *title, Package *plist) { PackingList p; Boolean ign = FALSE; char *prefix = NULL; const char *dir = "."; if (!Quiet) printf("%s%s", InfoPrefix, title); p = plist->head; while (p) { switch(p->type) { case PLIST_FILE: if (!ign) printf("%s/%s\n", elide_root(dir), p->name); ign = FALSE; break; case PLIST_CWD: if (!prefix) prefix = p->name; if (p->name == NULL) dir = prefix; else dir = p->name; break; case PLIST_IGNORE: ign = TRUE; break; /* Silence GCC in the -Wall mode */ default: break; } p = p->next; } }