]> git.ipfire.org Git - pakfire.git/commitdiff
request: Remove temporary files
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Sep 2021 16:19:24 +0000 (16:19 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Sep 2021 16:19:24 +0000 (16:19 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/request.c

index 489df8523d1c7251d1bac8a75f67b9dfd7ed4d69..769177b2889692ab14914aa2260703df6e700cad 100644 (file)
@@ -49,6 +49,9 @@ struct pakfire_request {
 
        Solver* solver;
        Queue jobs;
+
+       // Temporary files
+       char** cleanup_files;
 };
 
 /*
@@ -61,10 +64,29 @@ const char* pakfire_multiinstall_packages[] = {
 };
 
 static void pakfire_request_free(struct pakfire_request* request) {
+       int r;
+
        if (request->solver)
                solver_free(request->solver);
        queue_free(&request->jobs);
 
+       // Remove all cleanup files
+       if (request->cleanup_files) {
+               for (char** p = request->cleanup_files; *p; p++) {
+                       DEBUG(request->pakfire, "Cleaning up %s...\n", *p);
+
+                       // Unlink file
+                       r = unlink(*p);
+                       if (r && errno != ENOENT) {
+                               ERROR(request->pakfire, "Could not unlink %s: %m\n", *p);
+                       }
+
+                       free(*p);
+               }
+
+               free(request->cleanup_files);
+       }
+
        pakfire_unref(request->pakfire);
        free(request);
 }
@@ -439,6 +461,32 @@ ERROR:
        return r;
 }
 
+static int pakfire_request_cleanup_file(
+               struct pakfire_request* request, const char* path) {
+       size_t length = 0;
+
+       // Count existing elements
+       if (request->cleanup_files) {
+               for (char** p = request->cleanup_files; *p; p++)
+                       length++;
+       }
+
+       // Increase size of array
+       request->cleanup_files = reallocarray(request->cleanup_files,
+               length + 2, sizeof(*request->cleanup_files));
+       if (!request->cleanup_files) {
+               ERROR(request->pakfire, "Could not (re-)allocate cleanup_files: %m\n");
+               return 1;
+       }
+
+       request->cleanup_files[length] = strdup(path);
+
+       // Terminate array
+       request->cleanup_files[length + 1] = NULL;
+
+       return 0;
+}
+
 static int pakfire_request_add_url(struct pakfire_request* request, int action,
                const char* url, int extra_flags) {
        struct pakfire_downloader* downloader;
@@ -465,6 +513,11 @@ static int pakfire_request_add_url(struct pakfire_request* request, int action,
        if (r)
                goto ERROR;
 
+       // Cleanup this file when the request is being freed
+       r = pakfire_request_cleanup_file(request, path);
+       if (r)
+               goto ERROR;
+
        // Success
        r = 0;