return r;
}
-/*
- A helper function to close the archive and reset our data structures
-*/
-static void close_archive(struct pakfire_archive* archive, struct archive* a) {
- if (a)
- archive_read_free(a);
-}
-
/*
A helper function that opens the archive for reading
*/
return a;
ERROR:
- close_archive(archive, a);
+ if (a)
+ archive_read_free(a);
return NULL;
}
// Close the archive
if (a)
- close_archive(archive, a);
+ archive_read_free(a);
return r;
}
free(archive);
}
-static int pakfire_archive_create(struct pakfire_archive** archive, struct pakfire* pakfire) {
- struct pakfire_archive* a = calloc(1, sizeof(*a));
- if (!a)
- return ENOMEM;
-
- // Store a reference to the context
- a->ctx = pakfire_ctx(pakfire);
-
- a->pakfire = pakfire_ref(pakfire);
- a->nrefs = 1;
-
- *archive = a;
- return 0;
-}
-
PAKFIRE_EXPORT struct pakfire_archive* pakfire_archive_ref(struct pakfire_archive* archive) {
++archive->nrefs;
return 0;
}
-static int pakfire_archive_try_open(struct pakfire_archive* archive, const char* path) {
+static int pakfire_archive_try_open(struct pakfire_archive* archive) {
int r;
- // Check inputs
- if (!path)
- return -EINVAL;
-
- CTX_DEBUG(archive->ctx, "Opening archive %s\n", path);
-
- // Store path
- r = pakfire_string_set(archive->path, path);
- if (r < 0)
- return r;
+ CTX_DEBUG(archive->ctx, "Opening archive %s\n", archive->path);
// Open the file (and keep the file descriptor open)
archive->f = fopen(archive->path, "r");
r = fstat(fileno(archive->f), &archive->stat);
if (r) {
CTX_ERROR(archive->ctx, "Could not stat archive: %m\n");
- return r;
+ return -errno;
}
// Read all package metadata
- r = pakfire_archive_read_metadata(archive);
- if (r < 0)
- return r;
-
- return 0;
+ return pakfire_archive_read_metadata(archive);
}
-PAKFIRE_EXPORT int pakfire_archive_open(struct pakfire_archive** archive, struct pakfire* pakfire, const char* path) {
- int r = pakfire_archive_create(archive, pakfire);
- if (r)
+PAKFIRE_EXPORT int pakfire_archive_open(struct pakfire_archive** archive,
+ struct pakfire* pakfire, const char* path) {
+ struct pakfire_archive* a = NULL;
+ int r;
+
+ // Allocate a new object
+ a = calloc(1, sizeof(*a));
+ if (!a)
+ return -errno;
+
+ // Store a reference to the context
+ a->ctx = pakfire_ctx(pakfire);
+
+ // Store a reference to pakfire
+ a->pakfire = pakfire_ref(pakfire);
+
+ // Initialize the reference counter
+ a->nrefs = 1;
+
+ // Store path
+ r = pakfire_string_set(a->path, path);
+ if (r < 0)
return r;
- r = pakfire_archive_try_open(*archive, path);
- if (r)
+ // Try to open the archive
+ r = pakfire_archive_try_open(a);
+ if (r < 0)
goto ERROR;
- return 0;
+ // Return the pointer
+ *archive = pakfire_archive_ref(a);
ERROR:
- pakfire_archive_unref(*archive);
- *archive = NULL;
+ if (a)
+ pakfire_archive_unref(a);
return r;
}
if (pkg)
pakfire_package_unref(pkg);
if (a)
- close_archive(archive, a);
+ archive_read_free(a);
return r;
}