From: Michael Tremer Date: Thu, 13 May 2021 14:27:33 +0000 (+0000) Subject: archive: Read legacy filelists X-Git-Tag: 0.9.28~1285^2~139 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac6bafe1b831e3eee4660c92b0cbfb9b5ccb4343;p=pakfire.git archive: Read legacy filelists Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index c86c01664..d3ef3fa49 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -1035,14 +1035,72 @@ PAKFIRE_EXPORT unsigned int pakfire_archive_get_format(PakfireArchive archive) { return archive->format; } +static int pakfire_archive_parse_filelist(PakfireArchive archive, + struct archive* a, struct archive_entry* entry) { + int r; + char* data = NULL; + size_t size; + + // Read the data into memory + r = pakfire_archive_copy_data_to_buffer(archive->pakfire, a, entry, &data, &size); + if (r) { + ERROR(archive->pakfire, "Could not read filelist: %s\n", archive_error_string(a)); + goto ERROR; + } + + DEBUG(archive->pakfire, "Read filelist:\n%.*s\n", (int)size, data); + + r = pakfire_filelist_create_from_file(&archive->filelist, + archive->pakfire, data, archive->format); + +ERROR: + if (data) + free(data); + + return r; +} + +static int pakfire_archive_load_filelist(PakfireArchive archive) { + struct archive* a = NULL; + struct archive_entry* entry = NULL; + size_t size; + int r; + + // Open the archive + r = archive_open(archive, &a); + if (r) + goto ERROR; + + // Find the filelist file + r = find_archive_entry(&entry, a, "filelist"); + if (r) { + ERROR(archive->pakfire, "Could not find filelist in %s\n", archive->path); + goto ERROR; + } + + // Parse the filelist + r = pakfire_archive_parse_filelist(archive, a, entry); + if (r) + goto ERROR; + +ERROR: + // Destroy the filelist on error + if (r && archive->filelist) { + pakfire_filelist_unref(archive->filelist); + archive->filelist = NULL; + } + + archive_read_free(a); + + return r; +} + PAKFIRE_EXPORT PakfireFilelist pakfire_archive_get_filelist(PakfireArchive archive) { -#if 0 if (!archive->filelist) { int r = pakfire_archive_load_filelist(archive); if (r) return NULL; } -#endif return pakfire_filelist_ref(archive->filelist); } @@ -1548,8 +1606,11 @@ PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archiv } // Import filelist - if (archive->filelist) - pakfire_package_set_filelist(pkg, archive->filelist); + PakfireFilelist filelist = pakfire_archive_get_filelist(archive); + if (filelist) { + pakfire_package_set_filelist(pkg, filelist); + pakfire_filelist_unref(filelist); + } return pkg; } diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 1e165f867..52faf9be4 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -163,9 +163,13 @@ PAKFIRE_EXPORT size_t pakfire_filelist_total_filesize(PakfireFilelist list) { } static int pakfire_filelist_parse_line(PakfireFile* file, Pakfire pakfire, - char* line, unsigned int format) { + const char* line, unsigned int format) { unsigned int i = 0; + char* data = strdupa(line); + if (!data) + return 1; + // Allocate file int r = pakfire_file_create(file, pakfire); if (r) @@ -177,7 +181,7 @@ static int pakfire_filelist_parse_line(PakfireFile* file, Pakfire pakfire, unsigned int bytes_read = 0; - char* word = strtok(line, " "); + char* word = strtok(data, " "); while (word) { if (format >= 4) { switch (i) { @@ -285,26 +289,25 @@ static int pakfire_filelist_parse_line(PakfireFile* file, Pakfire pakfire, } int pakfire_filelist_create_from_file(PakfireFilelist* list, Pakfire pakfire, - const char* data, unsigned int format) { + char* data, unsigned int format) { + if (!data) { + errno = EINVAL; + return 1; + } + int r = pakfire_filelist_create(list, pakfire); if (r) return r; PakfireFile file = NULL; + char* p = data; - char* p = (char *)data; - char line[32 * 1024]; - - for (;;) { - line[0] = '\0'; - - pakfire_sgets(line, sizeof(line), &p); - pakfire_remove_trailing_newline(line); + while (*p) { + char* eol = strchr(p, '\n'); + if (eol) + *eol = '\0'; - if (*line == '\0') - break; - - int r = pakfire_filelist_parse_line(&file, pakfire, line, format); + int r = pakfire_filelist_parse_line(&file, pakfire, p, format); if (r) goto ERROR; @@ -314,6 +317,9 @@ int pakfire_filelist_create_from_file(PakfireFilelist* list, Pakfire pakfire, goto ERROR; pakfire_file_unref(file); + + // Move forward + p += strlen(p) + 1; } return 0; diff --git a/src/libpakfire/include/pakfire/filelist.h b/src/libpakfire/include/pakfire/filelist.h index 1c2cb4017..5476581e8 100644 --- a/src/libpakfire/include/pakfire/filelist.h +++ b/src/libpakfire/include/pakfire/filelist.h @@ -42,7 +42,7 @@ size_t pakfire_filelist_total_filesize(PakfireFilelist list); #ifdef PAKFIRE_PRIVATE int pakfire_filelist_create_from_file(PakfireFilelist* list, Pakfire pakfire, - const char* data, unsigned int format); + char* data, unsigned int format); int pakfire_filelist_scan(PakfireFilelist list, const char* root, const char** includes, const char** excludes); diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 43b10188e..a6edf71f1 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -1081,7 +1081,6 @@ PAKFIRE_EXPORT int pakfire_package_set_filelist(PakfirePackage pkg, PakfireFilel } pakfire_file_unref(file); - } return 0;