]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Add functions to add mirrors
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 Mar 2021 11:51:02 +0000 (11:51 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 Mar 2021 11:51:02 +0000 (11:51 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/downloader.h

index 09039d034822a33de7fce46873006dbfc4ab4291..2ed4b06b9b3e82508f56e9cca0d71dd1b5e1bcb9 100644 (file)
 */
 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) {
index ffdeddbcb4b4b56ee55abfd0e644e4c47e91ebfa..75116dabec1b2195e79b2b45fa526978b33437f5 100644 (file)
@@ -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);