Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/archival/libunarchive/data_extract_all.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/archival/libunarchive/data_extract_all.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software 14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 3 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 15 4 */ 16 17 #include <sys/types.h>18 19 #include <errno.h>20 #include <fcntl.h>21 #include <stdlib.h>22 #include <string.h>23 #include <utime.h>24 #include <unistd.h>25 #include <stdlib.h>26 5 27 6 #include "libbb.h" … … 35 14 36 15 if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) { 37 char *name = bb_xstrdup(file_header->name);38 bb_make_directory 16 char *name = xstrdup(file_header->name); 17 bb_make_directory(dirname(name), -1, FILEUTILS_RECUR); 39 18 free(name); 40 19 } … … 43 22 if (archive_handle->flags & ARCHIVE_EXTRACT_UNCONDITIONAL) { 44 23 /* Remove the existing entry if it exists */ 45 if (((file_header->mode & S_IFMT) != S_IFDIR) && (unlink(file_header->name) == -1) && (errno != ENOENT)) { 46 bb_perror_msg_and_die("Couldnt remove old file"); 24 if (((file_header->mode & S_IFMT) != S_IFDIR) 25 && (unlink(file_header->name) == -1) 26 && (errno != ENOENT) 27 ) { 28 bb_perror_msg_and_die("cannot remove old file %s", 29 file_header->name); 47 30 } 48 31 } … … 52 35 if (lstat(file_header->name, &statbuf) == -1) { 53 36 if (errno != ENOENT) { 54 bb_perror_msg_and_die(" Couldnt stat old file");37 bb_perror_msg_and_die("cannot stat old file"); 55 38 } 56 39 } 57 40 else if (statbuf.st_mtime <= file_header->mtime) { 58 41 if (!(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { 59 bb_error_msg("%s not created: newer or same age file exists", file_header->name); 42 bb_error_msg("%s not created: newer or " 43 "same age file exists", file_header->name); 60 44 } 61 45 data_skip(archive_handle); … … 63 47 } 64 48 else if ((unlink(file_header->name) == -1) && (errno != EISDIR)) { 65 bb_perror_msg_and_die("Couldnt remove old file %s", file_header->name); 49 bb_perror_msg_and_die("cannot remove old file %s", 50 file_header->name); 66 51 } 67 52 } … … 69 54 /* Handle hard links separately 70 55 * We identified hard links as regular files of size 0 with a symlink */ 71 if (S_ISREG(file_header->mode) && (file_header->link_name) && (file_header->size == 0)) { 56 if (S_ISREG(file_header->mode) && (file_header->link_target) 57 && (file_header->size == 0) 58 ) { 72 59 /* hard link */ 73 res = link(file_header->link_ name, file_header->name);60 res = link(file_header->link_target, file_header->name); 74 61 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { 75 bb_perror_msg("Couldnt create hard link"); 62 bb_perror_msg("cannot create %slink " 63 "from %s to %s", "hard", 64 file_header->name, 65 file_header->link_target); 76 66 } 77 67 } else { 78 68 /* Create the filesystem entry */ 79 switch(file_header->mode & S_IFMT) { 80 case S_IFREG: { 81 /* Regular file */ 82 dst_fd = bb_xopen(file_header->name, O_WRONLY | O_CREAT | O_EXCL); 83 bb_copyfd_size(archive_handle->src_fd, dst_fd, file_header->size); 84 close(dst_fd); 85 break; 86 } 87 case S_IFDIR: 88 res = mkdir(file_header->name, file_header->mode); 89 if ((errno != EISDIR) && (res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { 90 bb_perror_msg("extract_archive: %s", file_header->name); 91 } 92 break; 93 case S_IFLNK: 94 /* Symlink */ 95 res = symlink(file_header->link_name, file_header->name); 96 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { 97 bb_perror_msg("Cannot create symlink from %s to '%s'", file_header->name, file_header->link_name); 98 } 99 break; 100 case S_IFSOCK: 101 case S_IFBLK: 102 case S_IFCHR: 103 case S_IFIFO: 104 res = mknod(file_header->name, file_header->mode, file_header->device); 105 if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { 106 bb_perror_msg("Cannot create node %s", file_header->name); 107 } 108 break; 109 default: 110 bb_error_msg_and_die("Unrecognised file type"); 69 switch (file_header->mode & S_IFMT) { 70 case S_IFREG: { 71 /* Regular file */ 72 dst_fd = xopen3(file_header->name, O_WRONLY | O_CREAT | O_EXCL, 73 file_header->mode); 74 bb_copyfd_exact_size(archive_handle->src_fd, dst_fd, file_header->size); 75 close(dst_fd); 76 break; 77 } 78 case S_IFDIR: 79 res = mkdir(file_header->name, file_header->mode); 80 if ((res == -1) && (errno != EISDIR) 81 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) 82 ) { 83 bb_perror_msg("cannot make dir %s", file_header->name); 84 } 85 break; 86 case S_IFLNK: 87 /* Symlink */ 88 res = symlink(file_header->link_target, file_header->name); 89 if ((res == -1) 90 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) 91 ) { 92 bb_perror_msg("cannot create %slink " 93 "from %s to %s", "sym", 94 file_header->name, 95 file_header->link_target); 96 } 97 break; 98 case S_IFSOCK: 99 case S_IFBLK: 100 case S_IFCHR: 101 case S_IFIFO: 102 res = mknod(file_header->name, file_header->mode, file_header->device); 103 if ((res == -1) 104 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) 105 ) { 106 bb_perror_msg("cannot create node %s", file_header->name); 107 } 108 break; 109 default: 110 bb_error_msg_and_die("unrecognized file type"); 111 111 } 112 112 } … … 115 115 lchown(file_header->name, file_header->uid, file_header->gid); 116 116 } 117 if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM) && 118 (file_header->mode & S_IFMT) != S_IFLNK) 119 { 120 chmod(file_header->name, file_header->mode); 121 } 122 123 if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) { 124 struct utimbuf t; 125 t.actime = t.modtime = file_header->mtime; 126 utime(file_header->name, &t); 117 if ((file_header->mode & S_IFMT) != S_IFLNK) { 118 /* uclibc has no lchmod, glibc is even stranger - 119 * it has lchmod which seems to do nothing! 120 * so we use chmod... */ 121 if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM)) { 122 chmod(file_header->name, file_header->mode); 123 } 124 /* same for utime */ 125 if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) { 126 struct utimbuf t; 127 t.actime = t.modtime = file_header->mtime; 128 utime(file_header->name, &t); 129 } 127 130 } 128 131 }
Note:
See TracChangeset
for help on using the changeset viewer.