static int __pakfire_archive_filter_payload(struct pakfire* pakfire,
struct archive* a, struct archive_entry* entry, void* p) {
- struct pakfire_archive_read* _read = (struct pakfire_archive_read*)p;
- struct pakfire_archive* archive = _read->archive;
+ const char* path = archive_entry_pathname(entry);
+ if (!path)
+ return PAKFIRE_WALK_ERROR;
- const char* path = NULL;
+ switch (*path) {
+ case 'p':
+ if (strcmp(path, "pakfire-format") == 0)
+ return PAKFIRE_WALK_SKIP;
- // Format >= 6
- if (archive->format >= 6) {
- path = archive_entry_pathname(entry);
+ // Fallthrough
- // Skip any hidden files
- if (path && *path == '.')
- return ARCHIVE_RETRY;
- }
+ case '.':
+ return PAKFIRE_WALK_SKIP;
- // Otherwise permit reading any files
- return ARCHIVE_OK;
+ // The first file that isn't metadata was found, so we can end here
+ default:
+ return PAKFIRE_WALK_END;
+ }
}
static int __pakfire_archive_read_payload(struct pakfire* pakfire,
// Extract
r = pakfire_extract(archive->pakfire, a, archive->stat.st_size,
- filelist, prefix, nevra, flags);
+ filelist, prefix, nevra, __pakfire_archive_filter_payload, flags);
if (r)
goto ERROR;
DEBUG(pakfire, "Filter callback sent SKIP\n");
continue;
+ case PAKFIRE_WALK_END:
+ DEBUG(pakfire, "Filter callback sent END\n");
+
+ // Clear the callback function
+ filter_callback = NULL;
+ break;
+
// Raise any other errors
default:
DEBUG(pakfire, "Filter callback returned an error: %d\n", r);
int pakfire_extract(struct pakfire* pakfire, struct archive* archive,
size_t size, struct pakfire_filelist* filelist,
- const char* prefix, const char* message, int flags) {
+ const char* prefix, const char* message,
+ pakfire_walk_filter_callback filter_callback, int flags) {
int r = 1;
// Use an empty string if no prefix set
}
// Walk through the entire archive
- r = pakfire_walk(pakfire, archive, __pakfire_extract, NULL, &data);
+ r = pakfire_walk(pakfire, archive, __pakfire_extract, filter_callback, &data);
if (r)
goto ERROR;
// Request the next entry (only in filter callback)
PAKFIRE_WALK_SKIP = -20,
+
+ // Like PAKFIRE_WALK_OK, but the callback will not be called again
+ PAKFIRE_WALK_END = -30,
};
int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
int pakfire_extract(struct pakfire* pakfire, struct archive* archive,
size_t size, struct pakfire_filelist* filelist, const char* prefix,
- const char* message, int flags);
+ const char* message, pakfire_walk_filter_callback filter_callback,
+ int flags);
// Compress
enum pakfire_compress_flags {
// Extract snapshot
r = pakfire_extract(pakfire, archive, st.st_size, NULL, NULL,
- _("Extracting snapshot..."), PAKFIRE_EXTRACT_SHOW_THROUGHPUT);
+ _("Extracting snapshot..."), NULL, PAKFIRE_EXTRACT_SHOW_THROUGHPUT);
if (r)
goto ERROR;
testsuite_add_test(test_read);
#endif
testsuite_add_test(test_copy);
-#warning The filelist is being delivered incorrectly
-#if 0
testsuite_add_test(test_filelist);
-#endif
testsuite_add_test(test_extract);
testsuite_add_test(test_import);