summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm/sync.c')
-rw-r--r--lib/libalpm/sync.c133
1 files changed, 89 insertions, 44 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index d24a1e52..abc90de3 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -700,6 +700,90 @@ cleanup:
return(ret);
}
+/** Compares the md5sum of a file to the expected value.
+ *
+ * If the md5sum does not match, the user is asked whether the file
+ * should be deleted.
+ *
+ * @param trans the transaction
+ * @param filename the filename of the file to test
+ * @param md5sum the expected md5sum of the file
+ * @param data data to write the error messages to
+ *
+ * @return 0 if the md5sum matched, 1 otherwise
+ */
+static int test_md5sum(pmtrans_t *trans, const char *filename,
+ const char *md5sum, alpm_list_t **data)
+{
+ char *filepath;
+ char *md5sum2;
+ char *errormsg = NULL;
+ int ret = 0;
+
+ filepath = _alpm_filecache_find(filename);
+ md5sum2 = alpm_get_md5sum(filepath);
+
+ if(md5sum == NULL) {
+ /* TODO wtf is this? malloc'd strings for error messages? */
+ if((errormsg = calloc(512, sizeof(char))) == NULL) {
+ RET_ERR(PM_ERR_MEMORY, -1);
+ }
+ snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"),
+ filename);
+ *data = alpm_list_add(*data, errormsg);
+ ret = 1;
+ } else if(md5sum2 == NULL) {
+ if((errormsg = calloc(512, sizeof(char))) == NULL) {
+ RET_ERR(PM_ERR_MEMORY, -1);
+ }
+ snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"),
+ filename);
+ *data = alpm_list_add(*data, errormsg);
+ ret = 1;
+ } else if(strcmp(md5sum, md5sum2) != 0) {
+ int doremove = 0;
+ if((errormsg = calloc(512, sizeof(char))) == NULL) {
+ RET_ERR(PM_ERR_MEMORY, -1);
+ }
+ QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename,
+ NULL, NULL, &doremove);
+ if(doremove) {
+ unlink(filepath);
+ }
+ snprintf(errormsg, 512, _("file %s was corrupted (bad MD5 checksum)\n"),
+ filename);
+ *data = alpm_list_add(*data, errormsg);
+ ret = 1;
+ }
+
+ FREE(filepath);
+ FREE(md5sum2);
+
+ return(ret);
+}
+
+/** Compares the md5sum of a package to the expected value.
+ *
+ * @param trans the transaction
+ * @param pkg the package to test
+ * @param data data to write the error messages to
+ *
+ * @return 0 if the md5sum matched, 1 otherwise
+ */
+static int test_pkg_md5sum(pmtrans_t *trans, pmpkg_t *pkg, alpm_list_t **data)
+{
+ const char *filename;
+ const char *md5sum;
+ int ret = 0;
+
+ filename = alpm_pkg_get_filename(pkg);
+ md5sum = alpm_pkg_get_md5sum(pkg);
+
+ ret = test_md5sum(trans, filename, md5sum, data);
+
+ return(ret);
+}
+
int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
{
alpm_list_t *i, *j, *files = NULL;
@@ -761,54 +845,15 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
for(i = trans->packages; i; i = i->next) {
pmsyncpkg_t *sync = i->data;
pmpkg_t *spkg = sync->pkg;
- const char *filename;
- char *filepath;
- char *md5sum1, *md5sum2;
- char *ptr=NULL;
+ int ret = 0;
- filename = alpm_pkg_get_filename(spkg);
- md5sum1 = spkg->md5sum;
+ ret = test_pkg_md5sum(trans, spkg, data);
- if(md5sum1 == NULL) {
- /* TODO wtf is this? malloc'd strings for error messages? */
- if((ptr = calloc(512, sizeof(char))) == NULL) {
- RET_ERR(PM_ERR_MEMORY, -1);
- }
- snprintf(ptr, 512, _("can't get md5 checksum for package %s\n"), filename);
- *data = alpm_list_add(*data, ptr);
- retval = 1;
- continue;
- }
-
- filepath = _alpm_filecache_find(filename);
-
- md5sum2 = alpm_get_md5sum(filepath);
- if(md5sum2 == NULL) {
- if((ptr = calloc(512, sizeof(char))) == NULL) {
- RET_ERR(PM_ERR_MEMORY, -1);
- }
- snprintf(ptr, 512, _("can't get md5 checksum for package %s\n"), filename);
- *data = alpm_list_add(*data, ptr);
- retval = 1;
- continue;
- }
- if(strcmp(md5sum1, md5sum2) != 0) {
- int doremove=0;
- if((ptr = calloc(512, sizeof(char))) == NULL) {
- RET_ERR(PM_ERR_MEMORY, -1);
- }
- QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename,
- NULL, NULL, &doremove);
- if(doremove) {
- unlink(filepath);
- }
- snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 checksum)\n"),
- filename);
- *data = alpm_list_add(*data, ptr);
+ if(ret == 1) {
retval = 1;
+ } else if(ret == -1) { /* -1 is for serious errors */
+ RET_ERR(pm_errno, -1);
}
- FREE(filepath);
- FREE(md5sum2);
}
if(retval) {
pm_errno = PM_ERR_PKG_CORRUPTED;