diff options
author | Anatol Pomozov <anatol.pomozov@gmail.com> | 2020-04-19 04:15:44 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2020-05-09 03:58:39 +0200 |
commit | 22a58f5420438f35effb991696d37529d7a31969 (patch) | |
tree | 9f4c525f14409a1cba23c24d8ee21a4cd9c1e782 | |
parent | 557845bc971ff272c53da773baea277a2d2d47b8 (diff) | |
download | pacman-22a58f5420438f35effb991696d37529d7a31969.tar.gz pacman-22a58f5420438f35effb991696d37529d7a31969.tar.xz |
Swap alpm_db_update() implementation to multiplexed version
Now when all callers of the old alpm_db_update() function are gone we can
remove this implementation. And then rename alpm_dbs_update() function to
alpm_db_update().
Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | lib/libalpm/alpm.h | 40 | ||||
-rw-r--r-- | lib/libalpm/be_sync.c | 167 | ||||
-rw-r--r-- | src/pacman/util.c | 2 |
4 files changed, 7 insertions, 205 deletions
@@ -664,5 +664,8 @@ API CHANGES BETWEEN 5.2 AND 6.0 - ALPM_EVENT_PKGDOWNLOAD_START, ALPM_EVENT_PKGDOWNLOAD_DONE, ALPM_EVENT_PKGDOWNLOAD_FAILED [CHANGED] +- alpm_db_update() changed its signature and now accepts a list of databases + rather than a single database. This is need to handle database downloading + in a multiplexed way. [ADDED] diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 903e2fbc..3ea66ccc 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -1039,42 +1039,6 @@ int alpm_db_add_server(alpm_db_t *db, const char *url); int alpm_db_remove_server(alpm_db_t *db, const char *url); /** @} */ -/** Update a package database - * - * An update of the package database \a db will be attempted. Unless - * \a force is true, the update will only be performed if the remote - * database was modified since the last update. - * - * This operation requires a database lock, and will return an applicable error - * if the lock could not be obtained. - * - * Example: - * @code - * alpm_list_t *syncs = alpm_get_syncdbs(); - * for(i = syncs; i; i = alpm_list_next(i)) { - * alpm_db_t *db = alpm_list_getdata(i); - * result = alpm_db_update(0, db); - * - * if(result < 0) { - * printf("Unable to update database: %s\n", alpm_strerrorlast()); - * } else if(result == 1) { - * printf("Database already up to date\n"); - * } else { - * printf("Database updated\n"); - * } - * } - * @endcode - * - * @note After a successful update, the \link alpm_db_get_pkgcache() - * package cache \endlink will be invalidated - * @param force if true, then forces the update, otherwise update only in case - * the database isn't up to date - * @param db pointer to the package database to update - * @return 0 on success, -1 on error (pm_errno is set accordingly), 1 if up to - * to date - */ -int alpm_db_update(int force, alpm_db_t *db); - /** Update package databases * * An update of the package databases in the list \a dbs will be attempted. @@ -1087,7 +1051,7 @@ int alpm_db_update(int force, alpm_db_t *db); * Example: * @code * alpm_list_t *dbs = alpm_get_syncdbs(); - * ret = alpm_dbs_update(config->handle, dbs, force); + * ret = alpm_db_update(config->handle, dbs, force); * if(ret < 0) { * pm_printf(ALPM_LOG_ERROR, _("failed to synchronize all databases (%s)\n"), * alpm_strerror(alpm_errno(config->handle))); @@ -1102,7 +1066,7 @@ int alpm_db_update(int force, alpm_db_t *db); * the databases aren't up to date * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force); +int alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force); /** Get a package entry from a package database. * @param db pointer to the package database to get the package from diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 86015ab6..82018e15 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -136,172 +136,7 @@ valid: return 0; } -int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) -{ - char *syncpath; - const char *dbext; - alpm_list_t *i; - int updated = 0; - int ret = -1; - mode_t oldmask; - alpm_handle_t *handle; - int siglevel; - - /* Sanity checks */ - ASSERT(db != NULL, return -1); - handle = db->handle; - handle->pm_errno = ALPM_ERR_OK; - ASSERT(db != handle->db_local, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); - ASSERT(db->servers != NULL, RET_ERR(handle, ALPM_ERR_SERVER_NONE, -1)); - - if(!(db->usage & ALPM_DB_USAGE_SYNC)) { - return 0; - } - - syncpath = get_sync_dir(handle); - if(!syncpath) { - return -1; - } - - /* force update of invalid databases to fix potential mismatched database/signature */ - if(db->status & DB_STATUS_INVALID) { - force = 1; - } - - /* make sure we have a sane umask */ - oldmask = umask(0022); - - siglevel = alpm_db_get_siglevel(db); - - /* attempt to grab a lock */ - if(_alpm_handle_lock(handle)) { - free(syncpath); - umask(oldmask); - RET_ERR(handle, ALPM_ERR_HANDLE_LOCK, -1); - } - - dbext = db->handle->dbext; - - for(i = db->servers; i; i = i->next) { - const char *server = i->data, *final_db_url = NULL; - struct dload_payload payload = {0}; - size_t len; - int sig_ret = 0; - - /* set hard upper limit of 128MiB */ - payload.max_size = 128 * 1024 * 1024; - - /* print server + filename into a buffer */ - len = strlen(server) + strlen(db->treename) + strlen(dbext) + 2; - MALLOC(payload.fileurl, len, - { - free(syncpath); - umask(oldmask); - RET_ERR(handle, ALPM_ERR_MEMORY, -1); - } - ); - snprintf(payload.fileurl, len, "%s/%s%s", server, db->treename, dbext); - payload.handle = handle; - payload.force = force; - payload.unlink_on_fail = 1; - - ret = _alpm_download(&payload, syncpath, NULL, &final_db_url); - _alpm_dload_payload_reset(&payload); - updated = (updated || ret == 0); - - if(ret != -1 && updated && (siglevel & ALPM_SIG_DATABASE)) { - /* an existing sig file is no good at this point */ - char *sigpath = _alpm_sigpath(handle, _alpm_db_path(db)); - if(!sigpath) { - ret = -1; - break; - } - unlink(sigpath); - free(sigpath); - - - /* check if the final URL from internal downloader looks reasonable */ - if(final_db_url != NULL) { - if(strlen(final_db_url) < 3 - || strcmp(final_db_url + strlen(final_db_url) - strlen(dbext), - dbext) != 0) { - final_db_url = NULL; - } - } - - /* if we downloaded a DB, we want the .sig from the same server */ - if(final_db_url != NULL) { - /* print final_db_url into a buffer (leave space for .sig) */ - len = strlen(final_db_url) + 5; - } else { - /* print server + filename into a buffer (leave space for separator and .sig) */ - len = strlen(server) + strlen(db->treename) + strlen(dbext) + 6; - } - - MALLOC(payload.fileurl, len, - { - free(syncpath); - umask(oldmask); - RET_ERR(handle, ALPM_ERR_MEMORY, -1); - } - ); - - if(final_db_url != NULL) { - snprintf(payload.fileurl, len, "%s.sig", final_db_url); - } else { - snprintf(payload.fileurl, len, "%s/%s%s.sig", server, db->treename, dbext); - } - - payload.handle = handle; - payload.force = 1; - payload.errors_ok = (siglevel & ALPM_SIG_DATABASE_OPTIONAL); - - /* set hard upper limit of 16KiB */ - payload.max_size = 16 * 1024; - - sig_ret = _alpm_download(&payload, syncpath, NULL, NULL); - /* errors_ok suppresses error messages, but not the return code */ - sig_ret = payload.errors_ok ? 0 : sig_ret; - _alpm_dload_payload_reset(&payload); - } - - if(ret != -1 && sig_ret != -1) { - break; - } - } - - if(updated) { - /* Cache needs to be rebuilt */ - _alpm_db_free_pkgcache(db); - - /* clear all status flags regarding validity/existence */ - db->status &= ~DB_STATUS_VALID; - db->status &= ~DB_STATUS_INVALID; - db->status &= ~DB_STATUS_EXISTS; - db->status &= ~DB_STATUS_MISSING; - - /* if the download failed skip validation to preserve the download error */ - if(ret != -1 && sync_db_validate(db) != 0) { - /* pm_errno should be set */ - ret = -1; - } - } - - if(ret == -1) { - /* pm_errno was set by the download code */ - _alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n", - alpm_strerror(handle->pm_errno)); - } else { - handle->pm_errno = ALPM_ERR_OK; - } - - _alpm_handle_unlock(handle); - free(syncpath); - umask(oldmask); - return ret; -} - -int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force) { +int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force) { char *syncpath; const char *dbext = handle->dbext; alpm_list_t *i; diff --git a/src/pacman/util.c b/src/pacman/util.c index 9422c0c3..e9187529 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -154,7 +154,7 @@ int sync_syncdbs(int level, alpm_list_t *syncs) int force = (level < 2 ? 0 : 1); multibar_move_completed_up(false); - ret = alpm_dbs_update(config->handle, syncs, force); + ret = alpm_db_update(config->handle, syncs, force); if(ret < 0) { pm_printf(ALPM_LOG_ERROR, _("failed to synchronize all databases (%s)\n"), alpm_strerror(alpm_errno(config->handle))); |