aboutsummaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 23:18:59 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 23:18:59 +0100
commit8a936cfab718aee9f304f1b41e6b16cf6b5999f9 (patch)
tree5ae3e37a204a8d13e7e70b84a48ec415e464e98a /archival
parent425ad9c93b2736a0ebfbba6267bc1ad56c49d156 (diff)
downloadbusybox-w32-8a936cfab718aee9f304f1b41e6b16cf6b5999f9.tar.gz
busybox-w32-8a936cfab718aee9f304f1b41e6b16cf6b5999f9.tar.bz2
busybox-w32-8a936cfab718aee9f304f1b41e6b16cf6b5999f9.zip
tar: add support for --overwrite. +70 bytes.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival')
-rw-r--r--archival/libunarchive/data_extract_all.c5
-rw-r--r--archival/tar.c13
2 files changed, 15 insertions, 3 deletions
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index ae242df64..874d37d94 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -72,8 +72,11 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
72 switch (file_header->mode & S_IFMT) { 72 switch (file_header->mode & S_IFMT) {
73 case S_IFREG: { 73 case S_IFREG: {
74 /* Regular file */ 74 /* Regular file */
75 int flags = O_WRONLY | O_CREAT | O_EXCL;
76 if (archive_handle->ah_flags & ARCHIVE_O_TRUNC)
77 flags = O_WRONLY | O_CREAT | O_TRUNC;
75 dst_fd = xopen3(file_header->name, 78 dst_fd = xopen3(file_header->name,
76 O_WRONLY | O_CREAT | O_EXCL, 79 flags,
77 file_header->mode 80 file_header->mode
78 ); 81 );
79 bb_copyfd_exact_size(archive_handle->src_fd, dst_fd, file_header->size); 82 bb_copyfd_exact_size(archive_handle->src_fd, dst_fd, file_header->size);
diff --git a/archival/tar.c b/archival/tar.c
index 7ec101d31..5994d8913 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -751,6 +751,7 @@ enum {
751#if ENABLE_FEATURE_TAR_LONG_OPTIONS 751#if ENABLE_FEATURE_TAR_LONG_OPTIONS
752 OPTBIT_NUMERIC_OWNER, 752 OPTBIT_NUMERIC_OWNER,
753 OPTBIT_NOPRESERVE_PERM, 753 OPTBIT_NOPRESERVE_PERM,
754 OPTBIT_OVERWRITE,
754#endif 755#endif
755 OPT_TEST = 1 << 0, // t 756 OPT_TEST = 1 << 0, // t
756 OPT_EXTRACT = 1 << 1, // x 757 OPT_EXTRACT = 1 << 1, // x
@@ -771,6 +772,7 @@ enum {
771 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z 772 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
772 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner 773 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
773 OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions 774 OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions
775 OPT_OVERWRITE = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_OVERWRITE )) + 0, // overwrite
774}; 776};
775#if ENABLE_FEATURE_TAR_LONG_OPTIONS 777#if ENABLE_FEATURE_TAR_LONG_OPTIONS
776static const char tar_longopts[] ALIGN1 = 778static const char tar_longopts[] ALIGN1 =
@@ -807,9 +809,11 @@ static const char tar_longopts[] ALIGN1 =
807 "compress\0" No_argument "Z" 809 "compress\0" No_argument "Z"
808# endif 810# endif
809 /* use numeric uid/gid from tar header, not textual */ 811 /* use numeric uid/gid from tar header, not textual */
810 "numeric-owner\0" No_argument "\xfd" 812 "numeric-owner\0" No_argument "\xfc"
811 /* do not restore mode */ 813 /* do not restore mode */
812 "no-same-permissions\0" No_argument "\xfe" 814 "no-same-permissions\0" No_argument "\xfd"
815 /* on unpack, open with O_TRUNC and !O_EXCL */
816 "overwrite\0" No_argument "\xfe"
813 /* --exclude takes next bit position in option mask, */ 817 /* --exclude takes next bit position in option mask, */
814 /* therefore we have to put it _after_ --no-same-permissions */ 818 /* therefore we have to put it _after_ --no-same-permissions */
815# if ENABLE_FEATURE_TAR_FROM 819# if ENABLE_FEATURE_TAR_FROM
@@ -924,6 +928,11 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
924 if (opt & OPT_NOPRESERVE_PERM) 928 if (opt & OPT_NOPRESERVE_PERM)
925 tar_handle->ah_flags |= ARCHIVE_DONT_RESTORE_PERM; 929 tar_handle->ah_flags |= ARCHIVE_DONT_RESTORE_PERM;
926 930
931 if (opt & OPT_OVERWRITE) {
932 tar_handle->ah_flags &= ~ARCHIVE_UNLINK_OLD;
933 tar_handle->ah_flags |= ARCHIVE_O_TRUNC;
934 }
935
927 if (opt & OPT_GZIP) 936 if (opt & OPT_GZIP)
928 get_header_ptr = get_header_tar_gz; 937 get_header_ptr = get_header_tar_gz;
929 938