libxbps: modify the API, new func xbps_get_binpkg_repo_uri().

This function replaces xbps_repository_get_path_from_pkg_dict() and
xbps_get_binpkg_local_path(). It takes a pkg dictionary as returned
by a repository pkg index or a transaction dictionary and returns
a string with the full path to the binary pkg, either in local
repos, cachedir or remote repos.

Update all code to use this function... sorry I broke ABI compatiblity.
This commit is contained in:
Juan RP
2011-01-18 18:21:55 +01:00
parent 6d7121c5bd
commit fe15380e1b
7 changed files with 79 additions and 126 deletions

View File

@@ -70,26 +70,28 @@ show_missing_deps(prop_dictionary_t d)
show_missing_dep_cb, NULL);
}
static bool
static int
check_binpkg_hash(const char *path, const char *filename,
const char *sha256)
{
int rv = 0;
int rv;
printf("Checking %s integrity... ", filename);
rv = xbps_check_file_hash(path, sha256);
errno = rv;
if (rv != 0 && rv != ERANGE) {
fprintf(stderr, "\nxbps-bin: unexpected error: %s\n",
strerror(rv));
return false;
return rv;
} else if (rv == ERANGE) {
printf("hash mismatch!\n");
return false;
fprintf(stderr, "Package '%s' has wrong checksum, removing "
"and refetching it again...\n", filename);
(void)remove(path);
return rv;
}
printf("OK.\n");
return true;
return 0;
}
static int
@@ -97,85 +99,76 @@ download_package_list(prop_object_iterator_t iter)
{
prop_object_t obj;
const char *pkgver, *repoloc, *filename, *cachedir, *sha256;
char *binfile, *lbinfile;
char *binfile;
int rv = 0;
bool cksum;
cachedir = xbps_get_cachedir();
if (cachedir == NULL)
return EINVAL;
again:
while ((obj = prop_object_iterator_next(iter)) != NULL) {
cksum = false;
prop_dictionary_get_bool(obj, "checksum_ok", &cksum);
if (cksum == true)
continue;
prop_dictionary_get_cstring_nocopy(obj, "repository", &repoloc);
prop_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver);
prop_dictionary_get_cstring_nocopy(obj, "filename", &filename);
prop_dictionary_get_cstring_nocopy(obj,
"filename-sha256", &sha256);
lbinfile = xbps_get_binpkg_local_path(obj, repoloc);
if (lbinfile == NULL)
binfile = xbps_get_binpkg_repo_uri(obj);
if (binfile == NULL)
return errno;
/*
* If package is in a local repository, check its hash
* and pass to next one.
*/
if (!xbps_check_is_repo_string_remote(repoloc)) {
if (!check_binpkg_hash(lbinfile, filename, sha256)) {
free(lbinfile);
return errno;
}
free(lbinfile);
continue;
}
/*
* If downloaded package is in cachedir, check its hash
* and restart it again if doesn't match.
* and refetch the binpkg again if didn't match.
*/
if (access(lbinfile, R_OK) == 0) {
if (check_binpkg_hash(lbinfile, filename, sha256)) {
free(lbinfile);
continue;
}
if (errno && errno != ERANGE) {
free(lbinfile);
return errno;
} else if (errno == ERANGE) {
(void)remove(lbinfile);
printf("Refetching %s again...\n",
filename);
errno = 0;
if (access(binfile, R_OK) == 0) {
rv = check_binpkg_hash(binfile, filename, sha256);
free(binfile);
if (rv != 0 && rv != ERANGE) {
return rv;
} else if (rv == ERANGE) {
break;
}
prop_dictionary_set_bool(obj, "checksum_ok", true);
continue;
}
if (xbps_mkpath(__UNCONST(cachedir), 0755) == -1) {
free(lbinfile);
return errno;
}
binfile = xbps_repository_get_path_from_pkg_dict(obj, repoloc);
if (binfile == NULL) {
free(lbinfile);
free(binfile);
return errno;
}
printf("Downloading %s binary package ...\n", pkgver);
rv = xbps_fetch_file(binfile, cachedir, false, NULL);
free(binfile);
if (rv == -1) {
fprintf(stderr, "xbps-bin: couldn't download `%s'\n",
filename);
fprintf(stderr, "xbps-bin: %s returned: `%s'\n",
repoloc, xbps_fetch_error_string());
free(lbinfile);
free(binfile);
return -1;
}
if (!check_binpkg_hash(lbinfile, filename, sha256)) {
fprintf(stderr, "W: removing wrong %s file ...\n",
filename);
(void)remove(lbinfile);
free(lbinfile);
free(binfile);
binfile = xbps_get_binpkg_repo_uri(obj);
if (binfile == NULL)
return errno;
rv = check_binpkg_hash(binfile, filename, sha256);
free(binfile);
if (rv != 0 && rv != ERANGE) {
return rv;
} else if (rv == ERANGE) {
break;
}
free(lbinfile);
prop_dictionary_set_bool(obj, "checksum_ok", true);
}
prop_object_iterator_reset(iter);
if (rv == ERANGE)
goto again;
return 0;
}

View File

@@ -91,7 +91,7 @@ find_files_in_package(struct repository_pool_index *rpi, void *arg, bool *done)
printf("Looking in repository '%s', please wait...\n", rpi->rpi_uri);
while ((obj = prop_object_iterator_next(iter))) {
url = xbps_repository_get_path_from_pkg_dict(obj, rpi->rpi_uri);
url = xbps_get_binpkg_repo_uri(obj);
if (url == NULL) {
rv = -1;
break;

View File

@@ -250,7 +250,7 @@ show_pkg_info_from_repolist(const char *pkgname)
return errno;
prop_dictionary_get_cstring_nocopy(pkgd, "repository", &repoloc);
url = xbps_repository_get_path_from_pkg_dict(pkgd, repoloc);
url = xbps_get_binpkg_repo_uri(pkgd);
if (url == NULL) {
prop_object_release(pkgd);
return errno;