summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnatol Pomozov <anatol.pomozov@gmail.com>2020-04-14 06:40:54 +0200
committerAllan McRae <allan@archlinux.org>2020-05-09 03:58:21 +0200
commit1d42a8f954eed3205e84cfb946b67ba889b04135 (patch)
treec858d166021250894684e437352ce5d9564e5d95
parentfa68c33fa821cd7ddc5ae32baf62af2a238e44dc (diff)
downloadpacman-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>
-rw-r--r--lib/libalpm/dload.c50
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)