diff options
Diffstat (limited to 'src/pacman/package.c')
-rw-r--r-- | src/pacman/package.c | 79 |
1 files changed, 50 insertions, 29 deletions
diff --git a/src/pacman/package.c b/src/pacman/package.c index 413754c7..77a5ee72 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -1,7 +1,7 @@ /* * package.c * - * Copyright (c) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org> + * Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org> * Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> * * This program is free software; you can redistribute it and/or modify @@ -25,6 +25,7 @@ #include <string.h> #include <unistd.h> #include <limits.h> +#include <errno.h> #include <wchar.h> #include <alpm.h> @@ -106,15 +107,15 @@ void dump_pkg_full(pmpkg_t *pkg, int level) list_display(_("Replaces :"), alpm_pkg_get_replaces(pkg)); if(level < 0) { printf(_("Download Size : %6.2f K\n"), - (float)alpm_pkg_get_size(pkg) / 1024.0); + (double)alpm_pkg_get_size(pkg) / 1024.0); } if(level == 0) { printf(_("Compressed Size: %6.2f K\n"), - (float)alpm_pkg_get_size(pkg) / 1024.0); + (double)alpm_pkg_get_size(pkg) / 1024.0); } printf(_("Installed Size : %6.2f K\n"), - (float)alpm_pkg_get_isize(pkg) / 1024.0); + (double)alpm_pkg_get_isize(pkg) / 1024.0); string_display(_("Packager :"), alpm_pkg_get_packager(pkg)); string_display(_("Architecture :"), alpm_pkg_get_arch(pkg)); string_display(_("Build Date :"), bdatestr); @@ -157,6 +158,46 @@ void dump_pkg_sync(pmpkg_t *pkg, const char *treename, int level) dump_pkg_full(pkg, -level); } +static const char *get_backup_file_status(const char *root, + const char *filename, const char *expected_md5) +{ + char path[PATH_MAX]; + char *ret; + + snprintf(path, PATH_MAX, "%s%s", root, filename); + + /* if we find the file, calculate checksums, otherwise it is missing */ + if(access(path, R_OK) == 0) { + char *md5sum = alpm_compute_md5sum(path); + + if(md5sum == NULL) { + pm_fprintf(stderr, PM_LOG_ERROR, + _("could not calculate checksums for %s\n"), path); + return(NULL); + } + + /* if checksums don't match, file has been modified */ + if (strcmp(md5sum, expected_md5) != 0) { + ret = "MODIFIED"; + } else { + ret = "UNMODIFIED"; + } + free(md5sum); + } else { + switch(errno) { + case EACCES: + ret = "UNREADABLE"; + break; + case ENOENT: + ret = "MISSING"; + break; + default: + ret = "UNKNOWN"; + } + } + return(ret); +} + /* Display list of backup files and their modification states */ void dump_pkg_backups(pmpkg_t *pkg) @@ -167,37 +208,17 @@ void dump_pkg_backups(pmpkg_t *pkg) if(alpm_pkg_get_backup(pkg)) { /* package has backup files, so print them */ for(i = alpm_pkg_get_backup(pkg); i; i = alpm_list_next(i)) { - char path[PATH_MAX]; + const char *value; char *str = strdup(alpm_list_getdata(i)); - char *ptr = index(str, '\t'); + char *ptr = strchr(str, '\t'); if(ptr == NULL) { free(str); continue; } *ptr = '\0'; ptr++; - snprintf(path, PATH_MAX-1, "%s%s", root, str); - /* if we find the file, calculate checksums, otherwise it is missing */ - if(access(path, R_OK) == 0) { - char *md5sum = alpm_compute_md5sum(path); - - if(md5sum == NULL) { - pm_fprintf(stderr, PM_LOG_ERROR, - _("could not calculate checksums for %s\n"), path); - free(str); - continue; - } - - /* if checksums don't match, file has been modified */ - if (strcmp(md5sum, ptr)) { - printf(_("MODIFIED\t%s\n"), path); - } else { - printf(_("Not Modified\t%s\n"), path); - } - free(md5sum); - } else { - printf(_("MISSING\t\t%s\n"), path); - } + value = get_backup_file_status(root, str, ptr); + printf("%s\t%s%s\n", value, root, str); free(str); } } else { @@ -242,7 +263,7 @@ void dump_pkg_changelog(pmpkg_t *pkg) } else { /* allocate a buffer to get the changelog back in chunks */ char buf[CLBUF_SIZE]; - int ret = 0; + size_t ret = 0; while((ret = alpm_pkg_changelog_read(buf, CLBUF_SIZE, pkg, fp))) { if(ret < CLBUF_SIZE) { /* if we hit the end of the file, we need to add a null terminator */ |