return _pakfire_archive_count_signatures(signatures);
}
-PAKFIRE_EXPORT PakfireArchive pakfire_archive_create(Pakfire pakfire) {
- PakfireArchive archive = calloc(1, sizeof(*archive));
- if (archive) {
- DEBUG(pakfire, "Allocated new archive at %p\n", archive);
- archive->pakfire = pakfire_ref(pakfire);
- archive->nrefs = 1;
-
- archive->format = -1;
- archive->parser = pakfire_parser_create(pakfire, NULL, NULL, 0);
- archive->signatures = NULL;
-
- STAILQ_INIT(&archive->chksums);
- }
-
- return archive;
-}
-
-PAKFIRE_EXPORT PakfireArchive pakfire_archive_ref(PakfireArchive archive) {
- ++archive->nrefs;
-
- return archive;
-}
-
static void pakfire_archive_free_chksums(PakfireArchive archive) {
struct pakfire_archive_chksum* chksum;
free(archive);
}
+static int pakfire_archive_create(PakfireArchive* archive, Pakfire pakfire) {
+ PakfireArchive a = calloc(1, sizeof(*a));
+ if (!a)
+ return ENOMEM;
+
+ DEBUG(pakfire, "Allocated new archive at %p\n", archive);
+
+ a->pakfire = pakfire_ref(pakfire);
+ a->nrefs = 1;
+
+ // Set format to "unknown"
+ a->format = -1;
+
+ STAILQ_INIT(&a->chksums);
+
+ // Setup the parser
+ a->parser = pakfire_parser_create(pakfire, NULL, NULL, 0);
+ if (!a->parser)
+ goto ERROR;
+
+ *archive = a;
+
+ return 0;
+
+ERROR:
+ pakfire_archive_free(a);
+
+ return 1;
+}
+
+PAKFIRE_EXPORT PakfireArchive pakfire_archive_ref(PakfireArchive archive) {
+ ++archive->nrefs;
+
+ return archive;
+}
+
PAKFIRE_EXPORT PakfireArchive pakfire_archive_unref(PakfireArchive archive) {
if (!archive)
return NULL;
return pakfire_archive_walk(archive, pakfire_archive_read_metadata_entry);
}
+static int pakfire_archive_try_open(PakfireArchive archive, const char* path) {
+ archive->path = strdup(path);
+
+ // Stat the file and store the result
+ int r = stat(archive->path, &archive->stat);
+ if (r) {
+ ERROR(archive->pakfire, "Could not stat %s: %s\n",
+ archive->path, strerror(errno));
+
+ goto ERROR;
+ }
+
+ // Open the archive file for reading.
+ struct archive* a = NULL;
+ r = archive_open(archive, &a);
+ if (r)
+ goto ERROR;
+
+ // Parse all entries in the archive.
+ r = pakfire_archive_read_metadata(archive, a);
+ if (r) {
+ ERROR(archive->pakfire, "Could not read metadata from %s\n", archive->path);
+ goto ERROR;
+ }
+
+ // Close archive
+ archive_close(a);
+
+ return 0;
+
+ERROR:
+ if (a)
+ archive_read_free(a);
+
+ return r;
+}
+
+PAKFIRE_EXPORT int pakfire_archive_open(PakfireArchive* archive, Pakfire pakfire, const char* path) {
+ int r = pakfire_archive_create(archive, pakfire);
+ if (r)
+ return r;
+
+ r = pakfire_archive_try_open(*archive, path);
+ if (r)
+ goto ERROR;
+
+ return 0;
+
+ERROR:
+ pakfire_archive_unref(*archive);
+
+ return r;
+}
+
+
PAKFIRE_EXPORT char* pakfire_archive_get(PakfireArchive archive, const char* namespace, const char* key) {
return pakfire_parser_get(archive->parser, namespace, key);
}
return r;
}
-PAKFIRE_EXPORT PakfireArchive pakfire_archive_open(Pakfire pakfire, const char* path) {
- PakfireArchive archive = pakfire_archive_create(pakfire);
- archive->path = strdup(path);
-
- // Stat the file and store the result
- int r = stat(archive->path, &archive->stat);
- if (r) {
- ERROR(pakfire, "Could not stat %s: %s\n",
- archive->path, strerror(errno));
-
- goto error;
- }
-
- // Open the archive file for reading.
- struct archive* a;
- r = archive_open(archive, &a);
- if (r)
- goto error;
-
- // Parse all entries in the archive.
- r = pakfire_archive_read_metadata(archive, a);
- if (r) {
- ERROR(pakfire, "Could not read metadata from %s\n", archive->path);
- goto error;
- }
-
- // Close archive
- archive_close(a);
-
- return archive;
-
-error:
- if (a)
- archive_read_free(a);
-
- pakfire_archive_unref(archive);
-
- return NULL;
-}
-
static struct archive* archive_open_payload(struct archive* a) {
struct archive_entry* entry;
int r;
PAKFIRE_ARCHIVE_ADD_FILENAME_PREFIX = 1 << 1,
} pakfire_archive_flags_t;
-PakfireArchive pakfire_archive_create(Pakfire pakfire);
+int pakfire_archive_open(PakfireArchive* archive, Pakfire pakfire, const char* path);
PakfireArchive pakfire_archive_ref(PakfireArchive archive);
PakfireArchive pakfire_archive_unref(PakfireArchive archive);
Pakfire pakfire_archive_get_pakfire(PakfireArchive archive);
char* pakfire_archive_get(PakfireArchive archive, const char* namespace, const char* key);
-PakfireArchive pakfire_archive_open(Pakfire pakfire, const char* path);
-
int pakfire_archive_read(PakfireArchive archive, const char* filename,
void** data, size_t* data_size, int flags);
int pakfire_archive_extract(PakfireArchive archive, const char* prefix, int flags);
LOG("Trying to open %s\n", path);
// Open the archive
- PakfireArchive archive = pakfire_archive_open(t->pakfire, path);
- ASSERT(archive);
+ PakfireArchive archive;
+ ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, path));
// Verify the archive
pakfire_archive_verify_status_t verify = pakfire_archive_verify(archive);
char* path = pakfire_path_join(TEST_SRC_PATH, TEST_PKG1_PATH);
// Open the archive
- PakfireArchive archive = pakfire_archive_open(t->pakfire, path);
- ASSERT(archive);
+ PakfireArchive archive;
+ ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, path));
// Free path
free(path);
static int test_extract(const struct test* t) {
char* path = pakfire_path_join(TEST_SRC_PATH, TEST_PKG1_PATH);
- PakfireArchive archive = pakfire_archive_open(t->pakfire, path);
+ PakfireArchive archive;
+ ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, path));
free(path);
// Extract the archive payload
static int test_import(const struct test* t) {
char* path = pakfire_path_join(TEST_SRC_PATH, TEST_PKG1_PATH);
- PakfireArchive archive = pakfire_archive_open(t->pakfire, path);
+ PakfireArchive archive;
+ ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, path));
free(path);
PakfireRepo repo = pakfire_repo_create(t->pakfire, "tmp");