From: Michael Tremer Date: Tue, 4 May 2021 13:09:32 +0000 (+0000) Subject: Revert "archive: Drop parsing the filelist" X-Git-Tag: 0.9.28~1285^2~147 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd68805561dba427a753b2b40a9fe82fd75ad0a5;p=pakfire.git Revert "archive: Drop parsing the filelist" This reverts commit 1b970ec26ba977df90f233bb4d5106bf915848b8. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 5e0101669..c86c01664 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -477,6 +477,29 @@ CLEANUP: return r; } +static int pakfire_archive_parse_entry_filelist(PakfireArchive archive, + struct archive* a, struct archive_entry* e) { + char* data; + size_t data_size; + + int r = pakfire_archive_copy_data_to_buffer(archive->pakfire, a, e, &data, &data_size); + if (r) { + return 1; + } + + // Terminate string. + data[data_size] = '\0'; + + if (data_size > 0) { + r = pakfire_filelist_create_from_file(&archive->filelist, archive->pakfire, + data, archive->format); + } + + free(data); + + return r; +} + static int pakfire_archive_parse_entry_checksums(PakfireArchive archive, struct archive* a, struct archive_entry* e) { char* data; diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 39069c1f9..1e165f867 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -162,6 +162,168 @@ PAKFIRE_EXPORT size_t pakfire_filelist_total_filesize(PakfireFilelist list) { return s; } +static int pakfire_filelist_parse_line(PakfireFile* file, Pakfire pakfire, + char* line, unsigned int format) { + unsigned int i = 0; + + // Allocate file + int r = pakfire_file_create(file, pakfire); + if (r) + return r; + + ssize_t size; + mode_t mode; + time_t time; + + unsigned int bytes_read = 0; + + char* word = strtok(line, " "); + while (word) { + if (format >= 4) { + switch (i) { + // type + case 0: + break; + + // size + case 1: + size = atoi(word); + pakfire_file_set_size(*file, size); + break; + + // user + case 2: + pakfire_file_set_user(*file, word); + break; + + // group + case 3: + pakfire_file_set_group(*file, word); + break; + + // mode + case 4: + mode = atoi(word); + pakfire_file_set_mode(*file, mode); + break; + + // time + case 5: + time = atoi(word); + pakfire_file_set_ctime(*file, time); + break; + + // checksum + case 6: + pakfire_file_set_chksum(*file, word); + break; + + // path + #warning handle filenames with spaces + case 8: + pakfire_file_set_path(*file, line + bytes_read); + break; + } + + } else if (format >= 3) { + switch (i) { + // path + case 0: + pakfire_file_set_path(*file, word); + break; + + // type + case 1: + break; + + // size + case 2: + size = atoi(word); + pakfire_file_set_size(*file, size); + break; + + // user + case 3: + pakfire_file_set_user(*file, word); + break; + + // group + case 4: + pakfire_file_set_group(*file, word); + break; + + // mode + case 5: + mode = atoi(word); + pakfire_file_set_mode(*file, mode); + break; + + // time + case 6: + time = atoi(word); + pakfire_file_set_ctime(*file, time); + break; + + // checksum + case 7: + pakfire_file_set_chksum(*file, word); + break; + } + } + + // Count the bytes of the line that have been processed so far + // (Skip all padding spaces) + bytes_read += strlen(word) + 1; + while (*(line + bytes_read) == ' ') + bytes_read += 1; + + word = strtok(NULL, " "); + ++i; + } + + return 0; +} + +int pakfire_filelist_create_from_file(PakfireFilelist* list, Pakfire pakfire, + const char* data, unsigned int format) { + int r = pakfire_filelist_create(list, pakfire); + if (r) + return r; + + PakfireFile file = NULL; + + char* p = (char *)data; + char line[32 * 1024]; + + for (;;) { + line[0] = '\0'; + + pakfire_sgets(line, sizeof(line), &p); + pakfire_remove_trailing_newline(line); + + if (*line == '\0') + break; + + int r = pakfire_filelist_parse_line(&file, pakfire, line, format); + if (r) + goto ERROR; + + // Append file + r = pakfire_filelist_append(*list, file); + if (r) + goto ERROR; + + pakfire_file_unref(file); + } + + return 0; + +ERROR: + pakfire_filelist_unref(*list); + + return 1; +} + static int pakfire_filelist_is_included(const char* path, const char** includes) { // If the includes list is empty, everything is included if (!includes) diff --git a/src/libpakfire/include/pakfire/filelist.h b/src/libpakfire/include/pakfire/filelist.h index 493c58b3a..1c2cb4017 100644 --- a/src/libpakfire/include/pakfire/filelist.h +++ b/src/libpakfire/include/pakfire/filelist.h @@ -41,6 +41,9 @@ 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); + int pakfire_filelist_scan(PakfireFilelist list, const char* root, const char** includes, const char** excludes);