enum pakfire_transfer_flags flags;
int tries;
+ // POST MIME Object
+ curl_mime* mime;
+
// Size
size_t expected_size;
size_t transferred;
if (transfer->evp)
EVP_MD_CTX_free(transfer->evp);
+ if (transfer->mime)
+ curl_mime_free(transfer->mime);
if (transfer->fullurl)
curl_url_cleanup(transfer->fullurl);
return 0;
}
+int pakfire_downloader_transfer_add_param(struct pakfire_transfer* transfer,
+ const char* key, const char* format, ...) {
+ curl_mimepart* part = NULL;
+ char* buffer = NULL;
+ va_list args;
+ int r;
+
+ // Allocate the MIME object if not done, yet
+ if (!transfer->mime) {
+ transfer->mime = curl_mime_init(transfer->handle);
+
+ if (!transfer->mime) {
+ CTX_ERROR(transfer->ctx, "Could not allocate the MIME object: %s\n",
+ strerror(errno));
+ r = -errno;
+ goto ERROR;
+ }
+ }
+
+ // Format value
+ va_start(args, format);
+ r = vasprintf(&buffer, format, args);
+ va_end(args);
+
+ // Abort if we could not format the value
+ if (r < 0)
+ goto ERROR;
+
+ // Allocate another MIME part
+ part = curl_mime_addpart(transfer->mime);
+ if (!part) {
+ CTX_ERROR(transfer->ctx, "Could not allocate MIME part: %s\n",
+ strerror(errno));
+ r = errno;
+ goto ERROR;
+ }
+
+ // Set the key
+ r = curl_mime_name(part, key);
+ if (r) {
+ CTX_ERROR(transfer->ctx, "Could not set parameter key (%s): %s\n",
+ key, curl_easy_strerror(r));
+ goto ERROR;
+ }
+
+ // Set the data
+ r = curl_mime_data(part, buffer, CURL_ZERO_TERMINATED);
+ if (r) {
+ CTX_ERROR(transfer->ctx, "Could not set parameter data (%s): %s\n",
+ key, curl_easy_strerror(r));
+ goto ERROR;
+ }
+
+ERROR:
+ if (buffer)
+ free(buffer);
+
+ return r;
+}
+
int pakfire_downloader_transfer_set_output(struct pakfire_transfer* transfer, FILE* f) {
transfer->f = f;
return r;
}
+ // Add any payload
+ if (transfer->mime) {
+ r = curl_easy_setopt(transfer->handle, CURLOPT_MIMEPOST, transfer->mime);
+ if (r) {
+ CTX_ERROR(transfer->ctx, "Could not set POST payload: %s\n", curl_easy_strerror(r));
+ return r;
+ }
+ }
+
// If we do not have an output file, we will create a temporary file
if (!transfer->f) {
r = pakfire_downloader_transfer_prepare_tmpfile(transfer);
int pakfire_downloader_transfer_verify_digest(
struct pakfire_transfer* transfer, const enum pakfire_digest_types md,
const unsigned char* expected_digest, const size_t expected_digest_length);
+int pakfire_downloader_transfer_add_param(struct pakfire_transfer* transfer,
+ const char* key, const char* format, ...) __attribute__((format(printf, 3, 4)));
int pakfire_downloader_transfer_set_output(struct pakfire_transfer* transfer, FILE* f);
int pakfire_downloader_transfer_set_target(struct pakfire_transfer* transfer, const char* path);