]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Read legacy filelists
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 May 2021 14:27:33 +0000 (14:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 May 2021 14:27:33 +0000 (14:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/filelist.h
src/libpakfire/package.c

index c86c0166497463032a0cf8f7877418bd9f81b316..d3ef3fa49f358fa9542dbb206d5c5db126368025 100644 (file)
@@ -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;
 }
index 1e165f867586b0f0a389bca632f2debc1fe5d7a6..52faf9be4d498f6b010a0a6f159db20c84c469d5 100644 (file)
@@ -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;
index 1c2cb40178c498f491b22f4e4b7abbe63daf7abd..5476581e8901701361e7d6b57ad3b8a0d4790341 100644 (file)
@@ -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);
index 43b10188ecfda4e2ad8082acfe2146816923bf08..a6edf71f156b97b80b74501f84e7dbf445539efe 100644 (file)
@@ -1081,7 +1081,6 @@ PAKFIRE_EXPORT int pakfire_package_set_filelist(PakfirePackage pkg, PakfireFilel
                }
 
                pakfire_file_unref(file);
-
        }
 
        return 0;