From: Michael Tremer Date: Fri, 20 Oct 2023 09:25:56 +0000 (+0000) Subject: downloader: Allow sending and receiving data at the same time X-Git-Tag: 0.9.30~1430 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a5f866561e66cf77c8ee54d2ea1764331b55948;p=pakfire.git downloader: Allow sending and receiving data at the same time Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index 69e159f80..cc9381cfe 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -86,7 +86,10 @@ struct pakfire_transfer { // Temporary file char tempfile[PATH_MAX]; - FILE* f; + + // File handles for streams + FILE* fin; + FILE* fout; // Crypto Stuff EVP_MD_CTX* evp; @@ -172,9 +175,9 @@ static void pakfire_downloader_transfer_free(struct pakfire_transfer* transfer) if (*transfer->tempfile) unlink(transfer->tempfile); - // Close temporary file - if (transfer->f) - fclose(transfer->f); + // Close any streams + if (transfer->fin) + fclose(transfer->fin); // Free OpenSSL EVP context if (transfer->evp) @@ -326,7 +329,7 @@ static int debug_callback(CURL *handle, curl_infotype type, static size_t pakfire_downloader_transfer_read(char* data, size_t size, size_t nmemb, void* p) { struct pakfire_transfer* transfer = p; - return fread(data, size, nmemb, transfer->f); + return fread(data, size, nmemb, transfer->fout); } static int pakfire_downloader_transfer_seek(void* p, curl_off_t offset, int origin) { @@ -334,7 +337,7 @@ static int pakfire_downloader_transfer_seek(void* p, curl_off_t offset, int orig int r; // Perform the seek - r = fseek(transfer->f, (long)offset, origin); + r = fseek(transfer->fout, (long)offset, origin); if (r < 0) return CURL_SEEKFUNC_CANTSEEK; @@ -362,7 +365,7 @@ static size_t pakfire_downloader_transfer_write( } // Write everything to the allocated file descriptor - return fwrite(data, size, nmemb, transfer->f); + return fwrite(data, size, nmemb, transfer->fin); } static int pakfire_downloader_transfer_setup( @@ -688,7 +691,7 @@ ERROR: } int pakfire_downloader_transfer_set_output(struct pakfire_transfer* transfer, FILE* f) { - transfer->f = f; + transfer->fin = f; return 0; } @@ -718,7 +721,7 @@ int pakfire_downloader_transfer_set_input(struct pakfire_transfer* transfer, FIL transfer->direction = PAKFIRE_TRANSFER_UPLOAD; // Store the file handle - transfer->f = f; + transfer->fout = f; // Try to find the upload size if (fd > 0) { @@ -803,8 +806,8 @@ static int pakfire_transfer_save(struct pakfire_downloader* downloader, int r; // Flush any buffered data out to disk - if (transfer->f) - fflush(transfer->f); + if (transfer->fin) + fflush(transfer->fin); // Nothing to do if path isn't set if (!*transfer->path) @@ -848,7 +851,7 @@ static int pakfire_transfer_fail(struct pakfire_downloader* downloader, CTX_DEBUG(downloader->ctx, "Transfer failed\n"); // Get file descriptor - int fd = fileno(transfer->f); + int fd = fileno(transfer->fin); // Truncate downloaded data r = ftruncate(fd, 0); @@ -1256,7 +1259,7 @@ static int pakfire_downloader_transfer_prepare(struct pakfire_downloader* downlo } // If we do not have an output file, we will create a temporary file - if (!transfer->f) { + if (!transfer->fout && !transfer->fin) { r = pakfire_downloader_transfer_prepare_tmpfile(transfer); if (r) { CTX_ERROR(downloader->ctx, "Could not open a temporary file: %s\n", strerror(-r));