]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Make pakfire_archive_open take archive as first argument
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Apr 2021 18:00:34 +0000 (18:00 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Apr 2021 18:00:34 +0000 (18:00 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/archive.c
src/libpakfire/archive.c
src/libpakfire/include/pakfire/archive.h
src/libpakfire/libpakfire.sym
src/libpakfire/package.c
src/libpakfire/repo.c
tests/libpakfire/archive.c
tests/libpakfire/db.c

index e8d745150669091eceea9e329efad6a3a5d5fd90..5da0faee71e67e07a6c5221ae63d838feb6383da 100644 (file)
@@ -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;
        }
index 43b18f926d06f3534c65a9274a0b060140e2eed4..e9ae3bd93f420568412fa48f1ee5e0b182d57804 100644 (file)
@@ -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;
index 26da3219b250a28469c998fef729b11b9d2e8522..7fa87c11dc36d495c50e697fbcc56df40db846c9 100644 (file)
@@ -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);
index 6afe80bbc2b6e8d00af691a3a81c0b2450b5a675..6f53cf8138b3f1aaab6b2d3af8e8f21b180e5b2d 100644 (file)
@@ -58,7 +58,6 @@ global:
 
        # archive
        pakfire_archive_count_signatures;
-       pakfire_archive_create;
        pakfire_archive_extract;
        pakfire_archive_extraction_path;
        pakfire_archive_get;
index d8eea262ec21b36b1476d00477367e662498ecc1..d5007695f88affc74c2f607e57527118c8681b2b 100644 (file)
@@ -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) {
index e56c6e6f7d3419e976d46062fba9301c8027ead6..b74998247c0ee2a89faaeb2902ebdffa5af44890 100644 (file)
@@ -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);
index 6ddd1853a7365f0d579917b81e9bde6de46c4a50..a17ba0aff66f648593290947f44e8723e5164f97 100644 (file)
@@ -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");
index 1a12745b8f3b8b0c97f5d1d99ddd1961520c5344..96f81cbf4d64797420e23882da2cd69269ff392a 100644 (file)
@@ -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