mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 15:58:50 -05:00
Give sensible feedback when a repo has no configured servers
This fixes FS#14899. When running an -Sp operation without servers configured for a repository, we would segfault, so add an assert to the backend method returning the first server preventing a null pointer dereference. In addition, add a new error code to libalpm that indicates we have no servers configured for a repository. This makes -Sy and -S <package> operations fail gracefully and helpfully when a repo is set up with no servers, as the default mirrorlist in Arch is provided this way. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
19b8b63885
commit
aa579b8438
@ -480,6 +480,7 @@ enum _pmerrno_t {
|
||||
PM_ERR_DB_REMOVE,
|
||||
/* Servers */
|
||||
PM_ERR_SERVER_BAD_URL,
|
||||
PM_ERR_SERVER_NONE,
|
||||
/* Transactions */
|
||||
PM_ERR_TRANS_NOT_NULL,
|
||||
PM_ERR_TRANS_NULL,
|
||||
|
@ -232,6 +232,7 @@ const char SYMEXPORT *alpm_db_get_url(const pmdb_t *db)
|
||||
/* Sanity checks */
|
||||
ASSERT(handle != NULL, return(NULL));
|
||||
ASSERT(db != NULL, return(NULL));
|
||||
ASSERT(db->servers != NULL, return(NULL));
|
||||
|
||||
url = (char*)db->servers->data;
|
||||
|
||||
|
@ -388,6 +388,8 @@ int _alpm_download_single_file(const char *filename,
|
||||
alpm_list_t *i;
|
||||
int ret = -1;
|
||||
|
||||
ASSERT(servers != NULL, RET_ERR(PM_ERR_SERVER_NONE, -1));
|
||||
|
||||
for(i = servers; i; i = i->next) {
|
||||
const char *server = i->data;
|
||||
char *fileurl = NULL;
|
||||
|
@ -84,6 +84,8 @@ const char SYMEXPORT *alpm_strerror(int err)
|
||||
/* Servers */
|
||||
case PM_ERR_SERVER_BAD_URL:
|
||||
return _("invalid url for server");
|
||||
case PM_ERR_SERVER_NONE:
|
||||
return _("no servers configured for repository");
|
||||
/* Transactions */
|
||||
case PM_ERR_TRANS_NOT_NULL:
|
||||
return _("transaction already initialized");
|
||||
|
@ -769,7 +769,9 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||
if(_alpm_download_files(files, current->servers, cachedir)) {
|
||||
_alpm_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"),
|
||||
current->treename);
|
||||
pm_errno = PM_ERR_RETRIEVE;
|
||||
if(pm_errno == 0) {
|
||||
pm_errno = PM_ERR_RETRIEVE;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
FREELIST(files);
|
||||
|
@ -675,7 +675,15 @@ static int sync_trans(alpm_list_t *targets)
|
||||
for(i = packages; i; i = alpm_list_next(i)) {
|
||||
pmpkg_t *pkg = alpm_list_getdata(i);
|
||||
pmdb_t *db = alpm_pkg_get_db(pkg);
|
||||
printf("%s/%s\n", alpm_db_get_url(db), alpm_pkg_get_filename(pkg));
|
||||
const char *dburl = alpm_db_get_url(db);
|
||||
if(dburl) {
|
||||
printf("%s/%s\n", dburl, alpm_pkg_get_filename(pkg));
|
||||
} else {
|
||||
/* can't use WARNING here, we don't show warnings in -Sp... */
|
||||
pm_fprintf(stderr, PM_LOG_ERROR, _("no database for package: %s\n"),
|
||||
alpm_pkg_get_name(pkg));
|
||||
}
|
||||
|
||||
}
|
||||
/* we are done */
|
||||
goto cleanup;
|
||||
|
Loading…
Reference in New Issue
Block a user