From: Michael Tremer Date: Thu, 11 Mar 2021 11:51:02 +0000 (+0000) Subject: downloader: Add functions to add mirrors X-Git-Tag: 0.9.28~1285^2~570 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f11e5f2c25ba2cef423801619ea356f1b3aa6d2;p=pakfire.git downloader: Add functions to add mirrors Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index 09039d034..2ed4b06b9 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -39,6 +39,11 @@ */ static int curl_initialized = 0; +struct pakfire_mirror { + char url[PATH_MAX]; + unsigned int priority; +}; + struct pakfire_downloader { Pakfire pakfire; int nrefs; @@ -46,7 +51,10 @@ struct pakfire_downloader { // cURL multi handle CURLM* curl; + // Mirror stuff char baseurl[PATH_MAX]; + struct pakfire_mirror** mirrors; + unsigned int num_mirrors; }; struct pakfire_downloader_transfer { @@ -91,6 +99,13 @@ static void pakfire_downloader_free(struct pakfire_downloader* downloader) { if (!--curl_initialized) curl_global_cleanup(); + // Free mirrors + if (downloader->mirrors) { + for (unsigned int i = 0; i < downloader->num_mirrors; i++) + free(downloader->mirrors[i]); + free(downloader->mirrors); + } + pakfire_unref(downloader->pakfire); free(downloader); } @@ -144,6 +159,52 @@ void pakfire_downloader_set_baseurl( snprintf(downloader->baseurl, sizeof(downloader->baseurl) - 1, "%s", baseurl); } +static int pakfire_downloader_mirrors_cmp(const void* ptr1, const void* ptr2) { + struct pakfire_mirror* mirror1 = (struct pakfire_mirror*)ptr1; + struct pakfire_mirror* mirror2 = (struct pakfire_mirror*)ptr2; + + if (mirror1->priority > mirror2->priority) + return 1; + else if (mirror1->priority < mirror2->priority) + return -1; + else + return 0; +} + +static void pakfire_downloader_mirrors_sort(struct pakfire_downloader* downloader) { + if (!downloader->mirrors) + return; + + qsort(downloader->mirrors, downloader->num_mirrors, sizeof(*downloader->mirrors), + pakfire_downloader_mirrors_cmp); +} + +int pakfire_downloader_add_mirror(struct pakfire_downloader* downloader, + const char* url, unsigned int priority) { + // Make space for another mirror + downloader->mirrors = reallocarray(downloader->mirrors, + sizeof(*downloader->mirrors), downloader->num_mirrors + 1); + + // Allocate a new mirror object + struct pakfire_mirror* mirror = calloc(1, sizeof(*mirror)); + if (!mirror) + return ENOMEM; + + // Copy attributes + snprintf(mirror->url, sizeof(mirror->url) - 1, "%s", url); + mirror->priority = priority; + + // Append it to the list + downloader->mirrors[downloader->num_mirrors++] = mirror; + + // Sort mirrors + pakfire_downloader_mirrors_sort(downloader); + + DEBUG(downloader->pakfire, "Added mirror %s\n", mirror->url); + + return 0; +} + #ifdef ENABLE_DEBUG static int debug_callback(CURL *handle, curl_infotype type, char* data, size_t size, void* private) { diff --git a/src/libpakfire/include/pakfire/downloader.h b/src/libpakfire/include/pakfire/downloader.h index ffdeddbcb..75116dabe 100644 --- a/src/libpakfire/include/pakfire/downloader.h +++ b/src/libpakfire/include/pakfire/downloader.h @@ -35,6 +35,9 @@ struct pakfire_downloader* pakfire_downloader_unref(struct pakfire_downloader* d const char* pakfire_downloader_get_baseurl(struct pakfire_downloader* downloader); void pakfire_downloader_set_baseurl(struct pakfire_downloader* downloader, const char* baseurl); +int pakfire_downloader_add_mirror(struct pakfire_downloader* downloader, + const char* url, unsigned int priority); + int pakfire_downloader_add(struct pakfire_downloader* downloader, const char* url, const char* path);