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;
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)