qsort(list->elements, list->size, sizeof(*list->elements), __sort);
}
-static int pakfire_filelist_parse_line(struct pakfire_file** file, struct pakfire* pakfire,
- char* line, unsigned int format) {
- unsigned int i = 0;
-
- // Allocate file
- int r = pakfire_file_create(file, pakfire);
- if (r)
- return r;
-
- char buffer[PATH_MAX];
- ssize_t size;
- mode_t mode;
- time_t time;
-
- char* tok = NULL;
- char* word = strtok_r(line, " ", &tok);
-
- 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:
- // We don't support SHA-1 any more
- break;
-
- // path
- case 8:
- pakfire_string_format(buffer, "/%s", word);
- pakfire_file_set_path(*file, buffer);
- 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:
- // We don't support SHA-1 any more
- break;
- }
- }
-
- word = strtok_r(NULL, " ", &tok);
- ++i;
- }
-
- return 0;
-}
-
-int pakfire_filelist_create_from_file(struct pakfire_filelist** list, struct pakfire* pakfire,
- char* data, unsigned int format) {
- int r = pakfire_filelist_create(list, pakfire);
- if (r)
- return r;
-
- // Nothing to do, if input is empty
- if (!data)
- return 0;
-
- struct pakfire_file* file = NULL;
- char* tok = NULL;
-
- char* line = strtok_r(data, "\n", &tok);
- while (line) {
- 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);
-
- // Move forward
- line = strtok_r(NULL, "\n", &tok);
- }
-
- return 0;
-
-ERROR:
- pakfire_filelist_unref(*list);
-
- return 1;
-}
-
// Returns true if s contains globbing characters
static int is_glob(const char* s) {
if (strchr(s, '*'))