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)
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) {
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;
}