diff options
author | Anatol Pomozov <anatol.pomozov@gmail.com> | 2020-04-14 06:40:54 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2020-05-09 03:58:21 +0200 |
commit | 1d42a8f954eed3205e84cfb946b67ba889b04135 (patch) | |
tree | c858d166021250894684e437352ce5d9564e5d95 /lib | |
parent | fa68c33fa821cd7ddc5ae32baf62af2a238e44dc (diff) | |
download | pacman-1d42a8f954eed3205e84cfb946b67ba889b04135.tar.gz pacman-1d42a8f954eed3205e84cfb946b67ba889b04135.tar.xz |
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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/dload.c | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 4c81b11f..a413792a 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -598,6 +598,16 @@ cleanup: 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 /** Download a file given by a URL to a local directory. @@ -634,10 +644,42 @@ int _alpm_multi_download(alpm_handle_t *handle, alpm_list_t *payloads /* struct dload_payload */, const char *localpath) { - (void)handle; - (void)payloads; - (void)localpath; - return 0; + if(handle->fetchcb == NULL) { +#ifdef HAVE_LIBCURL + 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; + } } static char *filecache_find_url(alpm_handle_t *handle, const char *url) |