From: Michael Tremer Date: Tue, 28 Sep 2021 16:19:24 +0000 (+0000) Subject: request: Remove temporary files X-Git-Tag: 0.9.28~916 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3f3c4cab87ba3d5068625ef54c9c32066fd59c9;p=pakfire.git request: Remove temporary files Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 489df8523..769177b28 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -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;