*/
static int curl_initialized = 0;
+struct pakfire_mirror {
+ char url[PATH_MAX];
+ unsigned int priority;
+};
+
struct pakfire_downloader {
Pakfire pakfire;
int nrefs;
// cURL multi handle
CURLM* curl;
+ // Mirror stuff
char baseurl[PATH_MAX];
+ struct pakfire_mirror** mirrors;
+ unsigned int num_mirrors;
};
struct pakfire_downloader_transfer {
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);
}
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) {