aboutsummaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
Diffstat (limited to 'archival')
-rw-r--r--archival/Config.src2
-rw-r--r--archival/Kbuild.src3
-rw-r--r--archival/dpkg_deb.c9
-rw-r--r--archival/libunarchive/Kbuild.src2
-rw-r--r--archival/libunarchive/data_extract_all.c31
5 files changed, 27 insertions, 20 deletions
diff --git a/archival/Config.src b/archival/Config.src
index de453bc21..3dbd3aea1 100644
--- a/archival/Config.src
+++ b/archival/Config.src
@@ -5,6 +5,8 @@
5 5
6menu "Archival Utilities" 6menu "Archival Utilities"
7 7
8INSERT
9
8config FEATURE_SEAMLESS_XZ 10config FEATURE_SEAMLESS_XZ
9 bool "Make tar, rpm, modprobe etc understand .xz data" 11 bool "Make tar, rpm, modprobe etc understand .xz data"
10 default y 12 default y
diff --git a/archival/Kbuild.src b/archival/Kbuild.src
index 3300ea90f..076e58278 100644
--- a/archival/Kbuild.src
+++ b/archival/Kbuild.src
@@ -7,6 +7,9 @@
7libs-y += libunarchive/ 7libs-y += libunarchive/
8 8
9lib-y:= 9lib-y:=
10
11INSERT
12
10lib-$(CONFIG_AR) += ar.o 13lib-$(CONFIG_AR) += ar.o
11lib-$(CONFIG_CPIO) += cpio.o 14lib-$(CONFIG_CPIO) += cpio.o
12lib-$(CONFIG_DPKG) += dpkg.o 15lib-$(CONFIG_DPKG) += dpkg.o
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c
index cfbd78420..45a791bba 100644
--- a/archival/dpkg_deb.c
+++ b/archival/dpkg_deb.c
@@ -32,14 +32,17 @@ int dpkg_deb_main(int argc, char **argv)
32 ar_archive->filter = filter_accept_list_reassign; 32 ar_archive->filter = filter_accept_list_reassign;
33 33
34#if ENABLE_FEATURE_SEAMLESS_GZ 34#if ENABLE_FEATURE_SEAMLESS_GZ
35 llist_add_to(&(ar_archive->accept), (char*)"data.tar.gz"); 35 llist_add_to(&ar_archive->accept, (char*)"data.tar.gz");
36 llist_add_to(&control_tar_llist, (char*)"control.tar.gz"); 36 llist_add_to(&control_tar_llist, (char*)"control.tar.gz");
37#endif 37#endif
38
39#if ENABLE_FEATURE_SEAMLESS_BZ2 38#if ENABLE_FEATURE_SEAMLESS_BZ2
40 llist_add_to(&(ar_archive->accept), (char*)"data.tar.bz2"); 39 llist_add_to(&ar_archive->accept, (char*)"data.tar.bz2");
41 llist_add_to(&control_tar_llist, (char*)"control.tar.bz2"); 40 llist_add_to(&control_tar_llist, (char*)"control.tar.bz2");
42#endif 41#endif
42#if ENABLE_FEATURE_SEAMLESS_LZMA
43 llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma");
44 llist_add_to(&control_tar_llist, (char*)"control.tar.lzma");
45#endif
43 46
44 opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; 47 opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX";
45 opt = getopt32(argv, "cefXx"); 48 opt = getopt32(argv, "cefXx");
diff --git a/archival/libunarchive/Kbuild.src b/archival/libunarchive/Kbuild.src
index ed8e85793..81854558b 100644
--- a/archival/libunarchive/Kbuild.src
+++ b/archival/libunarchive/Kbuild.src
@@ -33,6 +33,8 @@ DPKG_FILES:= \
33 get_header_tar.o \ 33 get_header_tar.o \
34 filter_accept_list_reassign.o 34 filter_accept_list_reassign.o
35 35
36INSERT
37
36lib-$(CONFIG_AR) += get_header_ar.o unpack_ar_archive.o 38lib-$(CONFIG_AR) += get_header_ar.o unpack_ar_archive.o
37lib-$(CONFIG_BUNZIP2) += decompress_bunzip2.o 39lib-$(CONFIG_BUNZIP2) += decompress_bunzip2.o
38lib-$(CONFIG_UNLZMA) += decompress_unlzma.o 40lib-$(CONFIG_UNLZMA) += decompress_unlzma.o
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index 815261036..c4ffe7ef8 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -152,35 +152,32 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
152 bb_error_msg_and_die("unrecognized file type"); 152 bb_error_msg_and_die("unrecognized file type");
153 } 153 }
154 154
155 if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_OWNER)) { 155 if (!S_ISLNK(file_header->mode)) {
156#if ENABLE_FEATURE_TAR_UNAME_GNAME 156 if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_OWNER)) {
157 if (!(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER)) {
158 uid_t uid = file_header->uid; 157 uid_t uid = file_header->uid;
159 gid_t gid = file_header->gid; 158 gid_t gid = file_header->gid;
160 159#if ENABLE_FEATURE_TAR_UNAME_GNAME
161 if (file_header->tar__uname) { 160 if (!(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER)) {
161 if (file_header->tar__uname) {
162//TODO: cache last name/id pair? 162//TODO: cache last name/id pair?
163 struct passwd *pwd = getpwnam(file_header->tar__uname); 163 struct passwd *pwd = getpwnam(file_header->tar__uname);
164 if (pwd) uid = pwd->pw_uid; 164 if (pwd) uid = pwd->pw_uid;
165 } 165 }
166 if (file_header->tar__gname) { 166 if (file_header->tar__gname) {
167 struct group *grp = getgrnam(file_header->tar__gname); 167 struct group *grp = getgrnam(file_header->tar__gname);
168 if (grp) gid = grp->gr_gid; 168 if (grp) gid = grp->gr_gid;
169 }
169 } 170 }
171#endif
170 /* GNU tar 1.15.1 uses chown, not lchown */ 172 /* GNU tar 1.15.1 uses chown, not lchown */
171 chown(file_header->name, uid, gid); 173 chown(file_header->name, uid, gid);
172 } else 174 }
173#endif
174 chown(file_header->name, file_header->uid, file_header->gid);
175 }
176 if (!S_ISLNK(file_header->mode)) {
177 /* uclibc has no lchmod, glibc is even stranger - 175 /* uclibc has no lchmod, glibc is even stranger -
178 * it has lchmod which seems to do nothing! 176 * it has lchmod which seems to do nothing!
179 * so we use chmod... */ 177 * so we use chmod... */
180 if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_PERM)) { 178 if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_PERM)) {
181 chmod(file_header->name, file_header->mode); 179 chmod(file_header->name, file_header->mode);
182 } 180 }
183 /* same for utime */
184 if (archive_handle->ah_flags & ARCHIVE_RESTORE_DATE) { 181 if (archive_handle->ah_flags & ARCHIVE_RESTORE_DATE) {
185 struct timeval t[2]; 182 struct timeval t[2];
186 183