Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=82ccdd34164481d068a57494167f33cda404c136
commit 82ccdd34164481d068a57494167f33cda404c136 Author: Michel Hermier <[email protected]> Date: Tue Jun 3 14:50:11 2014 +0200 libpacman: Merge _pacman_trans_download_commit in pmtrans_t::commit. diff --git a/lib/libpacman/trans.cpp b/lib/libpacman/trans.cpp index 85b14e8..ba28630 100644 --- a/lib/libpacman/trans.cpp +++ b/lib/libpacman/trans.cpp @@ -410,189 +410,6 @@ error: return(-1); } -static -int _pacman_trans_download_commit(pmtrans_t *trans, pmlist_t **data) -{ - pmlist_t *i, *j, *files = NULL; - char ldir[PATH_MAX]; - int doremove, retval = 0, tries = 0; - int varcache = 1; - - trans->state = STATE_DOWNLOADING; - /* group sync records by repository and download */ - snprintf(ldir, PATH_MAX, "%s%s", handle->root, handle->cachedir); - - for(tries = 0; tries < handle->maxtries; tries++) { - retval = 0; - FREELIST(*data); - int done = 1; - for(i = handle->dbs_sync; i; i = i->next) { - struct stat buf; - Database *current = i->data; - - for(j = trans->syncpkgs; j; j = j->next) { - pmsyncpkg_t *ps = j->data; - Package *spkg = ps->pkg_new; - Database *dbs = spkg->database(); - - if(current == dbs) { - char filename[PATH_MAX]; - char lcpath[PATH_MAX]; - spkg->filename(filename, sizeof(filename)); - snprintf(lcpath, sizeof(lcpath), "%s/%s", ldir, filename); - - if(trans->flags & PM_TRANS_FLAG_PRINTURIS) { - if (!(trans->flags & PM_TRANS_FLAG_PRINTURIS_CACHED)) { - if (stat(lcpath, &buf) == 0) { - continue; - } - } - - EVENT(trans, PM_TRANS_EVT_PRINTURI, pacman_db_getinfo(c_cast(current), PM_DB_FIRSTSERVER), filename); - } else { - if(stat(lcpath, &buf)) { - /* file is not in the cache dir, so add it to the list */ - files = _pacman_stringlist_append(files, filename); - } else { - _pacman_log(PM_LOG_DEBUG, _("%s is already in the cache\n"), filename); - } - } - } - } - - if(files) { - EVENT(trans, PM_TRANS_EVT_RETRIEVE_START, current->treename, NULL); - if(stat(ldir, &buf)) { - /* no cache directory.... try creating it */ - _pacman_log(PM_LOG_WARNING, _("no %s cache exists. creating..."), ldir); - if(_pacman_makepath(ldir)) { - /* couldn't mkdir the cache directory, so fall back to /tmp and unlink - * the package afterwards. - */ - _pacman_log(PM_LOG_WARNING, _("couldn't create package cache, using /tmp instead")); - snprintf(ldir, PATH_MAX, "%s/tmp", handle->root); - if(pacman_set_option(PM_OPT_CACHEDIR, (long)"/tmp") == -1) { - _pacman_log(PM_LOG_WARNING, _("failed to set option CACHEDIR (%s)\n"), pacman_strerror(pm_errno)); - RET_ERR(PM_ERR_RETRIEVE, -1); - } - varcache = 0; - } - } - if(_pacman_downloadfiles(current->servers, ldir, files, tries) == -1) { - _pacman_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"), current->treename); - retval=1; - done = 0; - } - FREELIST(files); - } - } - if (!done) - continue; - if(trans->flags & PM_TRANS_FLAG_PRINTURIS) { - return(0); - } - - /* Check integrity of files */ - if(!(trans->flags & PM_TRANS_FLAG_NOINTEGRITY)) { - EVENT(trans, PM_TRANS_EVT_INTEGRITY_START, NULL, NULL); - - for(i = trans->syncpkgs; i; i = i->next) { - pmsyncpkg_t *ps = i->data; - Package *spkg = ps->pkg_new; - char str[PATH_MAX], pkgname[PATH_MAX]; - char *md5sum1, *md5sum2, *sha1sum1, *sha1sum2; - char *ptr=NULL; - - spkg->filename(pkgname, sizeof(pkgname)); - md5sum1 = spkg->md5sum; - sha1sum1 = spkg->sha1sum; - - if((md5sum1 == NULL) && (sha1sum1 == NULL)) { - if((ptr = (char *)malloc(512)) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); - } - snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); - *data = _pacman_list_add(*data, ptr); - retval = 1; - continue; - } - snprintf(str, PATH_MAX, "%s/%s/%s", handle->root, handle->cachedir, pkgname); - md5sum2 = _pacman_MDFile(str); - sha1sum2 = _pacman_SHAFile(str); - if(md5sum2 == NULL && sha1sum2 == NULL) { - if((ptr = (char *)malloc(512)) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); - } - snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); - *data = _pacman_list_add(*data, ptr); - retval = 1; - continue; - } - if((strcmp(md5sum1, md5sum2) != 0) && (strcmp(sha1sum1, sha1sum2) != 0)) { - _pacman_log(PM_LOG_DEBUG, _("expected md5: '%s'"), md5sum1); - _pacman_log(PM_LOG_DEBUG, _("actual md5: '%s'"), md5sum2); - _pacman_log(PM_LOG_DEBUG, _("expected sha1: '%s'"), sha1sum1); - _pacman_log(PM_LOG_DEBUG, _("actual sha1: '%s'"), sha1sum2); - - doremove = 0; - if((ptr = (char *)malloc(512)) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); - } - if(trans->flags & PM_TRANS_FLAG_ALLDEPS) { - doremove=1; - } else { - QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, pkgname, NULL, NULL, &doremove); - } - if(doremove) { - snprintf(str, PATH_MAX, "%s%s/%s-%s-%s" PM_EXT_PKG, handle->root, handle->cachedir, spkg->name(), spkg->version(), spkg->arch); - unlink(str); - snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); - } else { - snprintf(ptr, 512, _("archive %s is corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); - } - *data = _pacman_list_add(*data, ptr); - retval = 1; - } - FREE(md5sum2); - FREE(sha1sum2); - } - if(!retval) { - break; - } - } - } - - if(retval) { - pm_errno = PM_ERR_PKG_CORRUPTED; - goto error; - } - if(!(trans->flags & PM_TRANS_FLAG_NOINTEGRITY)) { - EVENT(trans, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL); - } - if(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY) { - return(0); - } - if(!retval) { - trans->state = STATE_COMMITING; - retval = _pacman_sync_commit(trans, data); - if(retval) { - goto error; - } - } - - if(!varcache && !(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY)) { - /* delete packages */ - for(i = files; i; i = i->next) { - unlink(i->data); - } - } - return(retval); - -error: - /* commiting failed, so this is still just a prepared transaction */ - return(-1); -} - pmsyncpkg_t *__pmtrans_t::add(pmsyncpkg_t *syncpkg, int flags) { pmsyncpkg_t *syncpkg_queued; @@ -1781,10 +1598,180 @@ int __pmtrans_t::commit(pmlist_t **data) _pacman_trans_set_state(this, STATE_COMMITING); if(m_type == PM_TRANS_TYPE_SYNC) { - if(_pacman_trans_download_commit(this, data) == -1) { - _pacman_trans_set_state(this, STATE_PREPARED); - return(-1); + pmlist_t *i, *j, *files = NULL; + char ldir[PATH_MAX]; + int doremove, retval = 0, tries = 0; + int varcache = 1; + + state = STATE_DOWNLOADING; + /* group sync records by repository and download */ + snprintf(ldir, PATH_MAX, "%s%s", handle->root, handle->cachedir); + + for(tries = 0; tries < handle->maxtries; tries++) { + retval = 0; + FREELIST(*data); + int done = 1; + for(i = handle->dbs_sync; i; i = i->next) { + struct stat buf; + Database *current = i->data; + + for(j = syncpkgs; j; j = j->next) { + pmsyncpkg_t *ps = j->data; + Package *spkg = ps->pkg_new; + Database *dbs = spkg->database(); + + if(current == dbs) { + char filename[PATH_MAX]; + char lcpath[PATH_MAX]; + spkg->filename(filename, sizeof(filename)); + snprintf(lcpath, sizeof(lcpath), "%s/%s", ldir, filename); + + if(flags & PM_TRANS_FLAG_PRINTURIS) { + if (!(flags & PM_TRANS_FLAG_PRINTURIS_CACHED)) { + if (stat(lcpath, &buf) == 0) { + continue; + } + } + + EVENT(this, PM_TRANS_EVT_PRINTURI, pacman_db_getinfo(c_cast(current), PM_DB_FIRSTSERVER), filename); + } else { + if(stat(lcpath, &buf)) { + /* file is not in the cache dir, so add it to the list */ + files = _pacman_stringlist_append(files, filename); + } else { + _pacman_log(PM_LOG_DEBUG, _("%s is already in the cache\n"), filename); + } + } + } + } + + if(files) { + EVENT(this, PM_TRANS_EVT_RETRIEVE_START, current->treename, NULL); + if(stat(ldir, &buf)) { + /* no cache directory.... try creating it */ + _pacman_log(PM_LOG_WARNING, _("no %s cache exists. creating..."), ldir); + if(_pacman_makepath(ldir)) { + /* couldn't mkdir the cache directory, so fall back to /tmp and unlink + * the package afterwards. + */ + _pacman_log(PM_LOG_WARNING, _("couldn't create package cache, using /tmp instead")); + snprintf(ldir, PATH_MAX, "%s/tmp", handle->root); + if(pacman_set_option(PM_OPT_CACHEDIR, (long)"/tmp") == -1) { + _pacman_log(PM_LOG_WARNING, _("failed to set option CACHEDIR (%s)\n"), pacman_strerror(pm_errno)); + RET_ERR(PM_ERR_RETRIEVE, -1); + } + varcache = 0; + } + } + if(_pacman_downloadfiles(current->servers, ldir, files, tries) == -1) { + _pacman_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"), current->treename); + retval=1; + done = 0; + } + FREELIST(files); + } + } + if (!done) + continue; + if(flags & PM_TRANS_FLAG_PRINTURIS) { + return(0); } + + /* Check integrity of files */ + if(!(flags & PM_TRANS_FLAG_NOINTEGRITY)) { + EVENT(this, PM_TRANS_EVT_INTEGRITY_START, NULL, NULL); + + for(i = syncpkgs; i; i = i->next) { + pmsyncpkg_t *ps = i->data; + Package *spkg = ps->pkg_new; + char str[PATH_MAX], pkgname[PATH_MAX]; + char *md5sum1, *md5sum2, *sha1sum1, *sha1sum2; + char *ptr=NULL; + + spkg->filename(pkgname, sizeof(pkgname)); + md5sum1 = spkg->md5sum; + sha1sum1 = spkg->sha1sum; + + if((md5sum1 == NULL) && (sha1sum1 == NULL)) { + if((ptr = (char *)malloc(512)) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); + *data = _pacman_list_add(*data, ptr); + retval = 1; + continue; + } + snprintf(str, PATH_MAX, "%s/%s/%s", handle->root, handle->cachedir, pkgname); + md5sum2 = _pacman_MDFile(str); + sha1sum2 = _pacman_SHAFile(str); + if(md5sum2 == NULL && sha1sum2 == NULL) { + if((ptr = (char *)malloc(512)) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); + *data = _pacman_list_add(*data, ptr); + retval = 1; + continue; + } + if((strcmp(md5sum1, md5sum2) != 0) && (strcmp(sha1sum1, sha1sum2) != 0)) { + _pacman_log(PM_LOG_DEBUG, _("expected md5: '%s'"), md5sum1); + _pacman_log(PM_LOG_DEBUG, _("actual md5: '%s'"), md5sum2); + _pacman_log(PM_LOG_DEBUG, _("expected sha1: '%s'"), sha1sum1); + _pacman_log(PM_LOG_DEBUG, _("actual sha1: '%s'"), sha1sum2); + + doremove = 0; + if((ptr = (char *)malloc(512)) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + if(flags & PM_TRANS_FLAG_ALLDEPS) { + doremove=1; + } else { + QUESTION(this, PM_TRANS_CONV_CORRUPTED_PKG, pkgname, NULL, NULL, &doremove); + } + if(doremove) { + snprintf(str, PATH_MAX, "%s%s/%s-%s-%s" PM_EXT_PKG, handle->root, handle->cachedir, spkg->name(), spkg->version(), spkg->arch); + unlink(str); + snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); + } else { + snprintf(ptr, 512, _("archive %s is corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); + } + *data = _pacman_list_add(*data, ptr); + retval = 1; + } + FREE(md5sum2); + FREE(sha1sum2); + } + if(!retval) { + break; + } + } + } + + if(retval) { + pm_errno = PM_ERR_PKG_CORRUPTED; + goto error; + } + if(!(flags & PM_TRANS_FLAG_NOINTEGRITY)) { + EVENT(this, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL); + } + if(flags & PM_TRANS_FLAG_DOWNLOADONLY) { + return(0); + } + if(!retval) { + state = STATE_COMMITING; + retval = _pacman_sync_commit(this, data); + if(retval) { + goto error; + } + } + + if(!varcache && !(flags & PM_TRANS_FLAG_DOWNLOADONLY)) { + /* delete packages */ + for(i = files; i; i = i->next) { + unlink(i->data); + } + } + return(retval); } else { int ret = 0; time_t t; @@ -2044,8 +2031,12 @@ int __pmtrans_t::commit(pmlist_t **data) } _pacman_trans_set_state(this, STATE_COMMITED); - return(0); + +error: + /* commiting failed, so this is still just a prepared transaction */ + _pacman_trans_set_state(this, STATE_PREPARED); + return(-1); } /* vim: set ts=2 sw=2 noet: */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
