return r;
}
-int pakfire_httpclient_remove_xfer(struct pakfire_httpclient* client,
+int pakfire_httpclient_dequeue_xfer(struct pakfire_httpclient* client,
struct pakfire_xfer* xfer) {
struct pakfire_httpclient_xfer* e = NULL;
- int r;
// Find reference
e = pakfire_httpclient_xfer_find(client, xfer);
+ if (!e)
+ return 0;
// Decrement the xfers counter
client->total_xfers--;
// Reduce the total download size
client->total_downloadsize -= pakfire_xfer_get_size(xfer);
+ TAILQ_REMOVE(&client->xfers, e, nodes);
+ pakfire_httpclient_xfer_free(e);
+
+ return 0;
+}
+
+int pakfire_httpclient_remove_xfer(struct pakfire_httpclient* client,
+ struct pakfire_xfer* xfer) {
+ int r;
+
// Remove the handle
r = curl_multi_remove_handle(client->curl, pakfire_xfer_handle(xfer));
if (r) {
ERROR(client->ctx, "Could not remove the handle: %s\n", curl_multi_strerror(r));
- goto ERROR;
+ return -ENOTSUP;
}
- if (e)
- TAILQ_REMOVE(&client->xfers, e, nodes);
-
-ERROR:
- if (e)
- pakfire_httpclient_xfer_free(e);
-
- return r;
+ return 0;
}
int pakfire_httpclient_run(struct pakfire_httpclient* client, const char* title) {
int pakfire_httpclient_enqueue_xfer(
struct pakfire_httpclient* client, struct pakfire_xfer* xfer);
+int pakfire_httpclient_dequeue_xfer(
+ struct pakfire_httpclient* client, struct pakfire_xfer* xfer);
int pakfire_httpclient_remove_xfer(
struct pakfire_httpclient* client, struct pakfire_xfer* xfer);
if (xfer->evp)
EVP_MD_CTX_free(xfer->evp);
+ // Remove the cURL handle
+ if (xfer->client)
+ pakfire_httpclient_remove_xfer(xfer->client, xfer);
+
// systemd
if (xfer->event)
sd_event_source_unref(xfer->event);
}
ERROR:
- // Remove the handle
+ // Remove the xfer from the queue
if (xfer->client)
- pakfire_httpclient_remove_xfer(xfer->client, xfer);
+ pakfire_httpclient_dequeue_xfer(xfer->client, xfer);
return r;
}