38 |
uint64_t size; |
uint64_t size; |
39 |
} __attribute__ ((packed)); |
} __attribute__ ((packed)); |
40 |
|
|
|
enum uar_file_type |
|
|
{ |
|
|
UF_FILE, |
|
|
UF_DIR, |
|
|
UF_LINK, |
|
|
}; |
|
|
|
|
41 |
struct uar_file |
struct uar_file |
42 |
{ |
{ |
43 |
enum uar_file_type type; |
enum uar_file_type type; |
426 |
} |
} |
427 |
|
|
428 |
struct uar_file * |
struct uar_file * |
429 |
uar_add_dir (struct uar_archive *uar, const char *dname, const char *path) |
uar_add_dir (struct uar_archive *uar, const char *dname, const char *path, |
430 |
|
bool (*callback) (struct uar_file *file, const char *fullname, |
431 |
|
const char *fullpath)) |
432 |
{ |
{ |
433 |
assert (uar != NULL && "uar is NULL"); |
assert (uar != NULL && "uar is NULL"); |
434 |
assert (dname != NULL && "dname is NULL"); |
assert (dname != NULL && "dname is NULL"); |
470 |
= uar_file_create (name, namelen, 0, uar->header.size); |
= uar_file_create (name, namelen, 0, uar->header.size); |
471 |
uint64_t dir_size = 0; |
uint64_t dir_size = 0; |
472 |
|
|
473 |
|
dir_file->type = UF_DIR; |
474 |
|
|
475 |
|
if (callback != NULL && !callback (dir_file, name, path)) |
476 |
|
{ |
477 |
|
uar_set_error (uar, UAR_SUCCESS); |
478 |
|
uar_file_destroy (dir_file); |
479 |
|
return NULL; |
480 |
|
} |
481 |
|
|
482 |
if (!uar_add_file_entry (uar, dir_file)) |
if (!uar_add_file_entry (uar, dir_file)) |
483 |
{ |
{ |
484 |
uar_file_destroy (dir_file); |
uar_file_destroy (dir_file); |
527 |
goto uar_add_dir_error; |
goto uar_add_dir_error; |
528 |
} |
} |
529 |
|
|
530 |
|
if (callback != NULL |
531 |
|
&& !callback (file, fullname, fullpath)) |
532 |
|
{ |
533 |
|
uar_set_error (uar, UAR_SUCCESS); |
534 |
|
goto uar_add_dir_error; |
535 |
|
} |
536 |
|
|
537 |
file->mode = stinfo.st_mode & 07777; |
file->mode = stinfo.st_mode & 07777; |
538 |
dir_size += file->data.size; |
dir_size += file->data.size; |
539 |
} |
} |
540 |
else if (S_ISDIR (stinfo.st_mode)) |
else if (S_ISDIR (stinfo.st_mode)) |
541 |
{ |
{ |
542 |
struct uar_file *direntry |
struct uar_file *direntry |
543 |
= uar_add_dir (uar, fullname, fullpath); |
= uar_add_dir (uar, fullname, fullpath, callback); |
544 |
|
|
545 |
if (direntry == NULL) |
if (direntry == NULL) |
546 |
{ |
{ |
567 |
goto uar_add_dir_end; |
goto uar_add_dir_end; |
568 |
} |
} |
569 |
|
|
|
dir_file->type = UF_DIR; |
|
570 |
dir_file->data.size = dir_size; |
dir_file->data.size = dir_size; |
571 |
|
|
572 |
uar_add_dir_end: |
uar_add_dir_end: |
716 |
: file->name; |
: file->name; |
717 |
} |
} |
718 |
|
|
719 |
|
enum uar_file_type |
720 |
|
uar_get_entry_type (const struct uar_file *file) |
721 |
|
{ |
722 |
|
return file->type; |
723 |
|
} |
724 |
|
|
725 |
bool |
bool |
726 |
uar_extract (struct uar_archive *uar, const char *cwd, |
uar_extract (struct uar_archive *uar, const char *cwd, |
727 |
bool (*callback) (struct uar_file *file)) |
bool (*callback) (struct uar_file *file)) |