Exemple #1
0
/* 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);
}
Exemple #2
0
/* 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);
}
Exemple #3
0
/* 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;
    }
}