]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Read file attributes from archive
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Mar 2021 01:38:39 +0000 (01:38 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Mar 2021 01:38:39 +0000 (01:38 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/db.c
src/libpakfire/file.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/file.h

index eb5000b640ea67bd488d5f3bca7e6d436b6bf00a..424f0996c27f4869c2aa1a2873393989fda57f27 100644 (file)
@@ -702,6 +702,10 @@ static int archive_copy_data(PakfireArchive archive, struct archive* in, struct
 static int archive_extract(PakfireArchive archive, struct archive* a, const char* prefix) {
        struct archive_entry* entry;
        int r;
+       PakfireFile file;
+
+       // Reset the filelist
+       pakfire_filelist_clear(archive->filelist);
 
        struct archive* ext = archive_write_disk_new();
 
@@ -728,6 +732,16 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char
                        break;
                }
 
+               // Create a new file object
+               r = pakfire_file_create(&file);
+               if (r)
+                       return r;
+
+               // Import attributes
+               r = pakfire_file_copy_archive_entry(file, entry);
+               if (r)
+                       return r;
+
                const char* archive_pathname = archive_entry_pathname(entry);
                size_t size = archive_entry_size(entry);
 
@@ -749,8 +763,6 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char
                        free(h);
                }
 
-               char* hexdigest = NULL;
-
                // Create file
                r = archive_write_header(ext, entry);
                if (r != ARCHIVE_OK) {
@@ -761,11 +773,26 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char
 
                // Copy payload
                if (size > 0) {
+                       char* hexdigest = NULL;
+
                        r = archive_copy_data(archive, a, ext, &hexdigest);
                        if (r != ARCHIVE_OK)
                                break;
+
+                       // Set checksum
+                       if (hexdigest) {
+                               pakfire_file_set_chksum(file, hexdigest);
+                               free(hexdigest);
+                       }
                }
 
+               // Append file to filelist
+               r = pakfire_filelist_append(archive->filelist, file);
+               if (r)
+                       break;
+
+               pakfire_file_unref(file);
+
                // Commit to disk
                r = archive_write_finish_entry(ext);
                switch (r) {
@@ -788,9 +815,6 @@ static int archive_extract(PakfireArchive archive, struct archive* a, const char
                                break;
                }
 
-               if (hexdigest)
-                       free(hexdigest);
-
                if (r != ARCHIVE_OK)
                        break;
        }
index c3be9889d7f6b72e6f44269c643461620ce4c723..2fa558f7429146a3b1a0dde7590614b5561530bf 100644 (file)
@@ -769,8 +769,10 @@ static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, Pakfire
        }
 
        // Nothing to do if the list is empty
-       if (pakfire_filelist_is_empty(filelist))
+       if (pakfire_filelist_is_empty(filelist)) {
+               r = 0;
                goto END;
+       }
 
        const char* sql = "INSERT INTO files(pkg, name, size, type, config, datafile, mode, "
                "user, 'group', hash1, mtime, capabilities) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
index 2821d48f4a5e238590eae19a3ab7d1aad3e5cea2..8ebd2eb829867e56d4531a1db9372a11d67fcaeb 100644 (file)
@@ -28,6 +28,8 @@
 #include <tar.h>
 #include <time.h>
 
+#include <archive_entry.h>
+
 #include <pakfire/constants.h>
 #include <pakfire/file.h>
 #include <pakfire/private.h>
@@ -113,6 +115,28 @@ PAKFIRE_EXPORT int pakfire_file_copy_stat(PakfireFile file, struct stat* stat) {
        return 0;
 }
 
+int pakfire_file_copy_archive_entry(PakfireFile file, struct archive_entry* entry) {
+       // Set name
+       pakfire_file_set_name(file, archive_entry_pathname(entry));
+
+       // Set size
+       pakfire_file_set_size(file, archive_entry_size(entry));
+
+       // Set mode
+       pakfire_file_set_mode(file, archive_entry_mode(entry));
+
+       // Set user
+       pakfire_file_set_user(file, archive_entry_uname(entry));
+
+       // Set group
+       pakfire_file_set_group(file, archive_entry_gname(entry));
+
+       // Set mtime
+       pakfire_file_set_time(file, archive_entry_mtime(entry));
+
+       return 0;
+}
+
 static void pakfire_file_free(PakfireFile file) {
        if (file->name)
                free(file->name);
index 644022b8c74697174c7dae2b3eead7ff9acff51b..200b8ba86272cbce905bcd2fe8c55d4427012189 100644 (file)
@@ -108,6 +108,9 @@ PAKFIRE_EXPORT PakfireFile pakfire_filelist_get(PakfireFilelist list, size_t ind
 }
 
 PAKFIRE_EXPORT int pakfire_filelist_append(PakfireFilelist list, PakfireFile file) {
+       if (!file)
+               return EINVAL;
+
        // Check if we have any space left
        if (list->size >= list->elements_size) {
                int r = pakfire_filelist_grow(list, 64);
index 62510ae98a358e7f9bb6462a6b613e4b2d92f2e2..780bf729c8ffe36f538c63d3b8e267abc88bee79 100644 (file)
@@ -73,4 +73,12 @@ void pakfire_file_set_chksum(PakfireFile file, const char* chksum);
 
 PakfireFile pakfire_file_parse_from_file(const char* list, unsigned int format);
 
+#ifdef PAKFIRE_PRIVATE
+
+#include <archive_entry.h>
+
+int pakfire_file_copy_archive_entry(PakfireFile file, struct archive_entry* entry);
+
+#endif
+
 #endif /* PAKFIRE_FILE_H */