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;
struct archive_entry* e, const char* entry_name) {
int ret;
- // Parse the filelist
- if (strcmp(PAKFIRE_ARCHIVE_FN_FILELIST, entry_name) == 0) {
- ret = pakfire_archive_parse_entry_filelist(archive, a, e);
- if (ret)
- return EINVAL;
-
// Parse the checksums
- } else if (strcmp(PAKFIRE_ARCHIVE_FN_CHECKSUMS, entry_name) == 0) {
+ if (strcmp(PAKFIRE_ARCHIVE_FN_CHECKSUMS, entry_name) == 0) {
ret = pakfire_archive_parse_entry_checksums(archive, a, e);
if (ret)
return EINVAL;
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)