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);
}
}
// 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;
}
}
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)
unsigned int bytes_read = 0;
- char* word = strtok(line, " ");
+ char* word = strtok(data, " ");
while (word) {
if (format >= 4) {
switch (i) {
}
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;
goto ERROR;
pakfire_file_unref(file);
+
+ // Move forward
+ p += strlen(p) + 1;
}
return 0;
#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);