From: Michael Tremer Date: Tue, 6 Apr 2021 18:00:34 +0000 (+0000) Subject: archive: Make pakfire_archive_open take archive as first argument X-Git-Tag: 0.9.28~1285^2~416 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf3e773a09e8700d8980cced6243d6068db3f5ce;p=pakfire.git archive: Make pakfire_archive_open take archive as first argument Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/archive.c b/src/_pakfire/archive.c index e8d745150..5da0faee7 100644 --- a/src/_pakfire/archive.c +++ b/src/_pakfire/archive.c @@ -51,8 +51,8 @@ static int Archive_init(ArchiveObject* self, PyObject* args, PyObject* kwds) { if (!PyArg_ParseTuple(args, "O!s", &PakfireType, &pakfire, &filename)) return -1; - self->archive = pakfire_archive_open(pakfire->pakfire, filename); - if (!self->archive) { + int r = pakfire_archive_open(&self->archive, pakfire->pakfire, filename); + if (r) { PyErr_SetFromErrno(PyExc_OSError); return -1; } diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 43b18f926..e9ae3bd93 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -335,29 +335,6 @@ PAKFIRE_EXPORT size_t pakfire_archive_count_signatures(PakfireArchive archive) { 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; @@ -402,6 +379,42 @@ static void pakfire_archive_free(PakfireArchive archive) { 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; @@ -642,6 +655,61 @@ static int pakfire_archive_read_metadata(PakfireArchive archive, struct archive* 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); } @@ -887,46 +955,6 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char 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; diff --git a/src/libpakfire/include/pakfire/archive.h b/src/libpakfire/include/pakfire/archive.h index 26da3219b..7fa87c11d 100644 --- a/src/libpakfire/include/pakfire/archive.h +++ b/src/libpakfire/include/pakfire/archive.h @@ -41,15 +41,13 @@ typedef enum pakfire_archive_flags { 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); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 6afe80bbc..6f53cf813 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -58,7 +58,6 @@ global: # archive pakfire_archive_count_signatures; - pakfire_archive_create; pakfire_archive_extract; pakfire_archive_extraction_path; pakfire_archive_get; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index d8eea262e..d5007695f 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -941,11 +941,16 @@ PAKFIRE_EXPORT PakfireArchive pakfire_package_get_archive(PakfirePackage pkg) { if (!path) return NULL; + PakfireArchive archive = NULL; + // Open archive - PakfireArchive archive = pakfire_archive_open(pkg->pakfire, path); + int r = pakfire_archive_open(&archive, pkg->pakfire, path); free(path); - return archive; + if (r == 0) + return archive; + + return NULL; } static int pakfire_package_fetch_legacy_filelist(PakfirePackage pkg, PakfireFilelist filelist) { diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index e56c6e6f7..b74998247 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -741,9 +741,10 @@ PAKFIRE_EXPORT int pakfire_repo_clean(PakfireRepo repo) { static int pakfire_repo_scan_file(PakfireRepo repo, const char* path) { DEBUG(repo->pakfire, "Scanning %s...\n", path); - PakfireArchive archive = pakfire_archive_open(repo->pakfire, path); - if (!archive) - return errno; + PakfireArchive archive; + int r = pakfire_archive_open(&archive, repo->pakfire, path); + if (r) + return r; // Import package into the repository PakfirePackage pkg = pakfire_archive_make_package(archive, repo); diff --git a/tests/libpakfire/archive.c b/tests/libpakfire/archive.c index 6ddd1853a..a17ba0aff 100644 --- a/tests/libpakfire/archive.c +++ b/tests/libpakfire/archive.c @@ -36,8 +36,8 @@ static int test_open(const struct test* t) { 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); @@ -53,8 +53,8 @@ static int test_filelist(const struct test* t) { 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); @@ -74,7 +74,8 @@ static int test_filelist(const struct test* t) { 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 @@ -93,7 +94,8 @@ static int test_extract(const struct test* t) { 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"); diff --git a/tests/libpakfire/db.c b/tests/libpakfire/db.c index 1a12745b8..96f81cbf4 100644 --- a/tests/libpakfire/db.c +++ b/tests/libpakfire/db.c @@ -78,7 +78,8 @@ static int test_add_package(const struct test* t) { char* path = pakfire_path_join(TEST_SRC_PATH, "data/beep-1.3-2.ip3.x86_64.pfm"); // Open archive - PakfireArchive archive = pakfire_archive_open(t->pakfire, path); + PakfireArchive archive; + ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, path)); ASSERT(archive); // Get package