PakfirePackage pkg;
PakfireFilelist filelist;
+ // Reader
+ struct archive* reader;
+
+ // Payload
struct archive* payload;
FILE* fpayload;
};
if (packager->fpayload)
fclose(packager->fpayload);
+ if (packager->reader)
+ archive_free(packager->reader);
+
pakfire_filelist_unref(packager->filelist);
pakfire_package_unref(packager->pkg);
pakfire_unref(packager->pakfire);
if (r)
goto ERROR;
+ // Open a reader
+ p->reader = archive_read_disk_new();
+ if (!p->reader) {
+ ERROR(p->pakfire, "archive_read_disk_new() failed\n");
+ goto ERROR;
+ }
+
+ // Do not read fflags
+ r = archive_read_disk_set_behavior(p->reader, ARCHIVE_READDISK_NO_FFLAGS);
+ if (r) {
+ ERROR(p->pakfire, "Could not change behavior of reader: %s\n",
+ archive_error_string(p->reader));
+ goto ERROR;
+ }
+
*packager = p;
return 0;
PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,
const char* path) {
FILE* f = NULL;
- struct stat st;
// Check if path is set
if (!path)
if (!packager->payload)
return EINVAL;
- // Stat the input file
- int r = stat(path, &st);
- if (r) {
- ERROR(packager->pakfire, "stat() on %s failed: %s\n", path, strerror(errno));
- return r;
- }
-
// Create a new file entry
struct archive_entry* entry = archive_entry_new();
if (!entry)
// Set path in archive
archive_entry_set_pathname(entry, path);
- // Copy all attributes from stat()
- archive_entry_copy_stat(entry, &st);
+ // Read all attributes from file
+ int r = archive_read_disk_entry_from_file(packager->reader, entry, -1, NULL);
+ if (r) {
+ ERROR(packager->pakfire, "Could not read attributes from %s: %s\n",
+ path, strerror(errno));
+ goto ERROR;
+ }
// Write the header
r = archive_write_header(packager->payload, entry);