summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnatol Pomozov <anatol.pomozov@gmail.com>2020-04-19 04:15:44 +0200
committerAllan McRae <allan@archlinux.org>2020-05-09 03:58:39 +0200
commit22a58f5420438f35effb991696d37529d7a31969 (patch)
tree9f4c525f14409a1cba23c24d8ee21a4cd9c1e782
parent557845bc971ff272c53da773baea277a2d2d47b8 (diff)
downloadpacman-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--README3
-rw-r--r--lib/libalpm/alpm.h40
-rw-r--r--lib/libalpm/be_sync.c167
-rw-r--r--src/pacman/util.c2
4 files changed, 7 insertions, 205 deletions
diff --git a/README b/README
index f5bbaf02..6aa68374 100644
--- a/README
+++ b/README
@@ -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)));