Solver* solver;
Queue jobs;
+
+ // Temporary files
+ char** cleanup_files;
};
/*
};
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);
}
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;
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;