From: Michael Tremer Date: Mon, 8 Mar 2021 01:38:39 +0000 (+0000) Subject: archive: Read file attributes from archive X-Git-Tag: 0.9.28~1285^2~608 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a6e3e2d7669bd58ad16938905ee5db1d2272fbf;p=pakfire.git archive: Read file attributes from archive Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index eb5000b64..424f0996c 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -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; } diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index c3be9889d..2fa558f74 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -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(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 2821d48f4..8ebd2eb82 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -28,6 +28,8 @@ #include #include +#include + #include #include #include @@ -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); diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 644022b8c..200b8ba86 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -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); diff --git a/src/libpakfire/include/pakfire/file.h b/src/libpakfire/include/pakfire/file.h index 62510ae98..780bf729c 100644 --- a/src/libpakfire/include/pakfire/file.h +++ b/src/libpakfire/include/pakfire/file.h @@ -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 + +int pakfire_file_copy_archive_entry(PakfireFile file, struct archive_entry* entry); + +#endif + #endif /* PAKFIRE_FILE_H */