From: Michael Tremer Date: Fri, 12 Mar 2021 19:28:40 +0000 (+0000) Subject: repo: Refactor setup and cleanup X-Git-Tag: 0.9.28~1285^2~546 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c2e3dd2245018b5dfa3df3d5e03c3ddc11024b2f;p=pakfire.git repo: Refactor setup and cleanup Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index ce2a5c598..f10c0b438 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -122,6 +122,21 @@ static void free_repo_appdata(struct pakfire_repo_appdata* appdata) { free(appdata); } +static void pakfire_repo_free(PakfireRepo repo, const int free_repo) { + DEBUG(repo->pakfire, "Releasing Repo at %p\n", repo); + + if (free_repo) { + free_repo_appdata(repo->repo->appdata); + repo_free(repo->repo, 0); + } + + if (repo->downloader) + pakfire_downloader_unref(repo->downloader); + pakfire_unref(repo->pakfire); + + free(repo); +} + void pakfire_repo_free_all(Pakfire pakfire) { Pool* pool = pakfire_get_solv_pool(pakfire); if (!pool) @@ -138,29 +153,48 @@ void pakfire_repo_free_all(Pakfire pakfire) { PAKFIRE_EXPORT PakfireRepo pakfire_repo_create(Pakfire pakfire, const char* name) { PakfireRepo repo = calloc(1, sizeof(*repo)); - if (repo) { - DEBUG(pakfire, "Allocated Repo at %p\n", repo); - repo->nrefs = 1; + if (!repo) + return NULL; - repo->pakfire = pakfire_ref(pakfire); + DEBUG(pakfire, "Allocated Repo at %p\n", repo); + + repo->pakfire = pakfire_ref(pakfire); + repo->nrefs = 1; - // Allocate a libsolv repository - Pool* pool = pakfire_get_solv_pool(pakfire); - repo->repo = repo_create(pool, name); + Pool* pool = pakfire_get_solv_pool(pakfire); - // Allocate repository appdata - repo->appdata = repo->repo->appdata = \ - calloc(1, sizeof(*repo->appdata)); + // Allocate a libsolv repository + repo->repo = repo_create(pool, name); + if (!repo->repo) { + ERROR(repo->pakfire, "Could not allocate repo: %s\n", strerror(errno)); + goto ERROR; + } - repo->appdata->repodata = repo_add_repodata(repo->repo, - REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION); + // Allocate repository appdata + repo->appdata = repo->repo->appdata = calloc(1, sizeof(*repo->appdata)); + if (!repo->appdata) { + ERROR(repo->pakfire, "Could not allocate repo appdata\n"); + goto ERROR; + } - // Make path to mirrorlist - repo->appdata->mirrorlist = pakfire_make_cache_path( - repo->pakfire, "repodata/%s/mirrorlist", pakfire_repo_get_name(repo)); + // Allocate repodata + repo->appdata->repodata = repo_add_repodata(repo->repo, + REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION); + if (!repo->appdata->repodata) { + ERROR(repo->pakfire, "Could not allocate repodata\n"); + goto ERROR; } + // Make path to mirrorlist + repo->appdata->mirrorlist = pakfire_make_cache_path( + repo->pakfire, "repodata/%s/mirrorlist", pakfire_repo_get_name(repo)); + return repo; + +ERROR: + pakfire_repo_free(repo, 1); + + return NULL; } PakfireRepo pakfire_repo_create_from_repo(Pakfire pakfire, Repo* r) { @@ -185,24 +219,12 @@ PAKFIRE_EXPORT PakfireRepo pakfire_repo_ref(PakfireRepo repo) { return repo; } -static void pakfire_repo_free(PakfireRepo repo) { - DEBUG(repo->pakfire, "Releasing Repo at %p\n", repo); - - if (repo->downloader) - pakfire_downloader_unref(repo->downloader); - pakfire_unref(repo->pakfire); - - free(repo); -} - PAKFIRE_EXPORT PakfireRepo pakfire_repo_unref(PakfireRepo repo) { - if (!repo) - return NULL; - if (--repo->nrefs > 0) return repo; - pakfire_repo_free(repo); + pakfire_repo_free(repo, 0); + return NULL; }