10 #include "unarchive.h"
12 extern void data_extract_all(archive_handle_t *archive_handle)
14 file_header_t *file_header = archive_handle->file_header;
18 if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) {
19 char *name = strdup(file_header->name);
20 make_directory (dirname(name), 0777, FILEUTILS_RECUR);
25 switch(file_header->mode & S_IFMT) {
28 if (file_header->link_name) {
30 res = link(file_header->link_name, file_header->name);
31 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
32 perror_msg("Couldnt create hard link");
38 dst_fd = xopen(file_header->name, O_WRONLY | O_CREAT);
39 copy_file_chunk_fd(archive_handle->src_fd, dst_fd, file_header->size);
45 res = mkdir(file_header->name, file_header->mode);
46 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
47 perror_msg("extract_archive: %s", file_header->name);
52 res = symlink(file_header->link_name, file_header->name);
53 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
54 perror_msg("Cannot create symlink from %s to '%s'", file_header->name, file_header->link_name);
61 res = mknod(file_header->name, file_header->mode, file_header->device);
62 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
63 perror_msg("Cannot create node %s", file_header->name);
68 chmod(file_header->name, file_header->mode);
69 chown(file_header->name, file_header->uid, file_header->gid);
71 if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) {
73 t.actime = t.modtime = file_header->mtime;
74 utime(file_header->name, &t);