Implement _alpm_multi_download

It is an equivalent of _alpm_download but accepts a list of payloads.

curl_multi_download_internal() is a stub at this moment and will be
implemented in the later commits of this patch series.

Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Anatol Pomozov 2020-04-13 21:40:54 -07:00 committed by Allan McRae
parent fa68c33fa8
commit 1d42a8f954

View file

@ -598,6 +598,16 @@ cleanup:
return ret; return ret;
} }
static int curl_multi_download_internal(alpm_handle_t *handle,
alpm_list_t *payloads /* struct dload_payload */,
const char *localpath)
{
(void)handle;
(void)payloads;
(void)localpath;
return 0;
}
#endif #endif
/** Download a file given by a URL to a local directory. /** Download a file given by a URL to a local directory.
@ -634,11 +644,43 @@ int _alpm_multi_download(alpm_handle_t *handle,
alpm_list_t *payloads /* struct dload_payload */, alpm_list_t *payloads /* struct dload_payload */,
const char *localpath) const char *localpath)
{ {
(void)handle; if(handle->fetchcb == NULL) {
(void)payloads; #ifdef HAVE_LIBCURL
(void)localpath; return curl_multi_download_internal(handle, payloads, localpath);
#else
RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1);
#endif
} else {
alpm_list_t *p;
for(p = payloads; p; p = p->next) {
struct dload_payload *payload = p->data;
alpm_list_t *s;
int success = 0;
for(s = payload->servers; s; s = s->next) {
const char *server = s->data;
char *fileurl;
int ret;
size_t len = strlen(server) + strlen(payload->filepath) + 2;
MALLOC(fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(fileurl, len, "%s/%s", server, payload->filepath);
ret = handle->fetchcb(fileurl, localpath, payload->force);
free(fileurl);
if (ret != -1) {
success = 1;
break;
}
}
if(!success && !payload->errors_ok) {
RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1);
}
}
return 0; return 0;
} }
}
static char *filecache_find_url(alpm_handle_t *handle, const char *url) static char *filecache_find_url(alpm_handle_t *handle, const char *url)
{ {