| |
pkg_repo_fetch(struct pkg *pkg)
|
| |
{
|
| |
char dest[MAXPATHLEN + 1];
|
| + |
char url[MAXPATHLEN + 1];
|
| |
char cksum[SHA256_DIGEST_LENGTH * 2 +1];
|
| - |
char *path;
|
| - |
char *url;
|
| + |
char *path = NULL;
|
| + |
const char *packagesite = NULL;
|
| |
int retcode = EPKG_OK;
|
| |
|
| |
assert((pkg->type & PKG_REMOTE) == PKG_REMOTE ||
|
| |
(pkg->type & PKG_UPGRADE) == PKG_UPGRADE);
|
| |
|
| + |
if ((packagesite = pkg_config("PACKAGESITE")) == NULL) {
|
| + |
pkg_emit_error("pkg_repo_fetch(): %s", "PACKAGESITE is not defined");
|
| + |
return (EPKG_FATAL);
|
| + |
}
|
| + |
|
| |
snprintf(dest, sizeof(dest), "%s/%s", pkg_config("PKG_CACHEDIR"),
|
| |
pkg_get(pkg, PKG_REPOPATH));
|
| |
|
| |
retcode = EPKG_FATAL;
|
| |
goto cleanup;
|
| |
}
|
| + |
|
| |
if ((retcode = mkdirs(path)) != 0)
|
| |
goto cleanup;
|
| |
|
| - |
asprintf(&url, "%s/%s", pkg_config("PACKAGESITE"),
|
| - |
pkg_get(pkg, PKG_REPOPATH));
|
| + |
if (packagesite[strlen(packagesite) - 1] == '/')
|
| + |
snprintf(url, sizeof(url), "%s%s", packagesite,
|
| + |
pkg_get(pkg, PKG_REPOPATH));
|
| + |
else
|
| + |
snprintf(url, sizeof(url), "%s/%s", packagesite,
|
| + |
pkg_get(pkg, PKG_REPOPATH));
|
| |
|
| |
retcode = pkg_fetch_file(url, dest);
|
| - |
free(url);
|
| + |
|
| |
if (retcode != EPKG_OK)
|
| |
goto cleanup;
|
| |
|
| |
retcode = sha256_file(dest, cksum);
|
| |
if (retcode == EPKG_OK)
|
| |
if (strcmp(cksum, pkg_get(pkg, PKG_CKSUM))) {
|
| - |
pkg_emit_error("%s failed checksum from repo",
|
| - |
pkg_get(pkg, PKG_NAME));
|
| + |
pkg_emit_error("%s-%s failed checksum from repository",
|
| + |
pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION));
|
| |
retcode = EPKG_FATAL;
|
| |
}
|
| |
|