]> git.ipfire.org Git - pakfire.git/commitdiff
Revert "archive: Drop parsing the filelist"
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 4 May 2021 13:09:32 +0000 (13:09 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 4 May 2021 13:09:32 +0000 (13:09 +0000)
This reverts commit 1b970ec26ba977df90f233bb4d5106bf915848b8.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/filelist.h

index 5e01016690208e3e8879bad8c8b030d39a662d38..c86c0166497463032a0cf8f7877418bd9f81b316 100644 (file)
@@ -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;
index 39069c1f9ac2294879ad1815879722935fe162ac..1e165f867586b0f0a389bca632f2debc1fe5d7a6 100644 (file)
@@ -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)
index 493c58b3a7ea58234246d2a37a52052a85dbc834..1c2cb40178c498f491b22f4e4b7abbe63daf7abd 100644 (file)
@@ -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);