[pacman-dev] [PATCH v2] Swap alpm_db_update() implementation to multiplexed version

Anatol Pomozov anatol.pomozov at gmail.com
Thu May 7 01:49:05 UTC 2020


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 at gmail.com>
---
 README                |   3 +
 lib/libalpm/alpm.h    |  40 +---------
 lib/libalpm/be_sync.c | 167 +-----------------------------------------
 src/pacman/util.c     |   2 +-
 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 add1a576..97808e21 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 2a021987..90cd46c9 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 = 0;
-	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)));
-- 
2.26.2


More information about the pacman-dev mailing list