From 9d09c9fdf7f6156e81c28045e36970158f26d2f1 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 8 Aug 2011 19:42:52 -0500 Subject: Attempt to fix up some of the brokenness around failed package loads This is a bit of a mess, due to the fact that we have a progress meter running. It is also ironic that we are in the midst of a method named "commit" when we haven't done a damn thing yet, and can still fail hard if either a checksum or signature is invalid or unrecognized. Adapt the former test_md5sum method to be invoked for any of the various failure types, which at least gives the user some indication of what packages are failing. A second patch will be needed to actually show worthwhile error codes, but this is going to involve modifying the actual data passed with the callback. Signed-off-by: Dan McGee --- lib/libalpm/sync.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'lib/libalpm/sync.c') diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index ca7e6579..663fca6c 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -677,24 +677,18 @@ static int apply_deltas(alpm_handle_t *handle) * * @param trans the transaction * @param filename the absolute path of the file to test - * @param md5sum the expected md5sum of the file * - * @return 0 if the md5sum matched, 1 if not, -1 in case of errors + * @return 1 if file was removed, 0 otherwise */ -static int test_md5sum(alpm_trans_t *trans, const char *filepath, - const char *md5sum) +static int prompt_to_delete(alpm_trans_t *trans, const char *filepath) { - int ret = _alpm_test_md5sum(filepath, md5sum); - if(ret == 1) { - int doremove = 0; - QUESTION(trans, ALPM_TRANS_CONV_CORRUPTED_PKG, (char *)filepath, - NULL, NULL, &doremove); - if(doremove) { - unlink(filepath); - } + int doremove = 0; + QUESTION(trans, ALPM_TRANS_CONV_CORRUPTED_PKG, (char *)filepath, + NULL, NULL, &doremove); + if(doremove) { + unlink(filepath); } - - return ret; + return doremove; } static int validate_deltas(alpm_handle_t *handle, alpm_list_t *deltas, @@ -715,7 +709,9 @@ static int validate_deltas(alpm_handle_t *handle, alpm_list_t *deltas, alpm_delta_t *d = alpm_list_getdata(i); char *filepath = _alpm_filecache_find(handle, d->delta); - if(test_md5sum(trans, filepath, d->delta_md5) != 0) { + ret = _alpm_test_md5sum(filepath, d->delta_md5); + if(ret != 0) { + prompt_to_delete(trans, filepath); errors++; *data = alpm_list_add(*data, strdup(d->delta)); } @@ -903,6 +899,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data) alpm_pkg_t *pkgfile =_alpm_pkg_load_internal(handle, filepath, 1, spkg->md5sum, spkg->base64_sig, level); if(!pkgfile) { + prompt_to_delete(trans, filepath); errors++; *data = alpm_list_add(*data, strdup(filename)); FREE(filepath); @@ -920,7 +917,10 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data) if(errors) { - RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1); + if(!handle->pm_errno) { + RET_ERR(handle, ALPM_ERR_PKG_INVALID, -1); + } + return -1; } if(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY) { -- cgit v1.2.3-24-g4f1b