]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Allow sending and receiving data at the same time
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 09:25:56 +0000 (09:25 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 09:25:56 +0000 (09:25 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c

index 69e159f80110f7a63c7dd1cd838cf2d18d59a314..cc9381cfe845b626b5f2a73bcb406c9bac0b9ad5 100644 (file)
@@ -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));