diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/alpm.c | 38 | ||||
| -rw-r--r-- | lib/libalpm/alpm.h | 1 | 
2 files changed, 39 insertions, 0 deletions
diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 9336bc4c..d3eceefa 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -534,6 +534,44 @@ int alpm_pkg_free(pmpkg_t *pkg)  	return(0);  } +/** Check the integrity of a package from the sync cache. + * @param pkg package pointer + * @return 0 on success, -1 on error (pm_errno is set accordingly) + */ +int alpm_pkg_checkmd5sum(pmpkg_t *pkg) +{ +	char *path = NULL; +	char *md5sum = NULL; +	int retval = 0; + +	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); +	ASSERT(pkg->md5sum[0] != 0, RET_ERR(PM_ERR_XXX, -1)); + +	asprintf(&path, "%s%s/%s-%s" PM_EXT_PKG, +	                handle->root, handle->cachedir, +	                pkg->name, pkg->version); + +	md5sum = MDFile(path); +	if(md5sum == NULL) { +		_alpm_log(PM_LOG_ERROR, "could not get md5 checksum for package %s-%s\n", +		          pkg->name, pkg->version); +		pm_errno = PM_ERR_NOT_A_FILE; +		retval = -1; +	} else { +		if(strcmp(md5sum, pkg->md5sum) != 0) { +			_alpm_log(PM_LOG_ERROR, "md5sums do not match for package %s-%s\n", +			                        pkg->name, pkg->version); +			pm_errno = PM_ERR_PKG_INVALID; +			retval = -1; +		} +	} + +	FREE(path); +	FREE(md5sum); + +	return(retval); +} +  /** Compare versions.   * @param ver1 first version   * @param ver2 secont version diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 47318ada..1980d89c 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -164,6 +164,7 @@ enum {  void *alpm_pkg_getinfo(PM_PKG *pkg, unsigned char parm);  int alpm_pkg_load(char *filename, PM_PKG **pkg);  int alpm_pkg_free(PM_PKG *pkg); +int alpm_pkg_checkmd5sum(PM_PKG *pkg);  int alpm_pkg_vercmp(const char *ver1, const char *ver2);  /*  | 
