aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2002-08-13 05:06:43 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2002-08-13 05:06:43 +0000
commit1d23f3a492ecc18b3e406d814a55c93bb8917e0e (patch)
treed54376d977df67e05d11e4388245bd532936a9d5
parent6069441bd20b24f7102ebd66f9373a4de0d7e92c (diff)
downloadbusybox-w32-1d23f3a492ecc18b3e406d814a55c93bb8917e0e.tar.gz
busybox-w32-1d23f3a492ecc18b3e406d814a55c93bb8917e0e.tar.bz2
busybox-w32-1d23f3a492ecc18b3e406d814a55c93bb8917e0e.zip
Enable support for the old tar header format, enable via menu's
-rw-r--r--archival/config.in3
-rw-r--r--archival/libunarchive/get_header_tar.c40
2 files changed, 38 insertions, 5 deletions
diff --git a/archival/config.in b/archival/config.in
index ac90ec0a9..140e4fb76 100644
--- a/archival/config.in
+++ b/archival/config.in
@@ -18,7 +18,8 @@ bool 'tar' CONFIG_TAR
18if [ "$CONFIG_TAR" = "y" ] ; then 18if [ "$CONFIG_TAR" = "y" ] ; then
19 bool ' Enable archive creation' CONFIG_FEATURE_TAR_CREATE 19 bool ' Enable archive creation' CONFIG_FEATURE_TAR_CREATE
20 bool ' Enable -X and --exclude options (exclude files)' CONFIG_FEATURE_TAR_EXCLUDE 20 bool ' Enable -X and --exclude options (exclude files)' CONFIG_FEATURE_TAR_EXCLUDE
21 bool ' Enable -z option' CONFIG_FEATURE_TAR_GZIP 21 bool ' Enable -z option' CONFIG_FEATURE_TAR_GZIP
22 bool ' Enable support for old tar header format' CONFIG_FEATURE_TAR_OLD_FORMAT
22fi 23fi
23if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then 24if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
24 bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE 25 bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index be6bf2a06..07b9ae36f 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -60,11 +60,18 @@ file_header_t *get_header_tar(FILE *tar_stream)
60 } 60 }
61 archive_offset += 512; 61 archive_offset += 512;
62 62
63 /* Check header has valid magic, unfortunately some tar files 63 /* Check header has valid magic, "ustar" is for the proper tar
64 * have empty (0'ed) tar entries at the end, which will 64 * 0's are for the old tar format
65 * cause this to fail, so fail silently for now
66 */ 65 */
67 if (strncmp(tar.formated.magic, "ustar", 5) != 0) { 66 if (strncmp(tar.formated.magic, "ustar", 5) != 0) {
67#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
68 if (strncmp(tar.formated.magic, "\0\0\0\0\0", 5) != 0)
69#endif
70 return(NULL);
71 }
72
73 /* If there is no filename its an empty header, skip it */
74 if (xstrlen(tar.formated.name) == 0) {
68 return(NULL); 75 return(NULL);
69 } 76 }
70 77
@@ -85,7 +92,32 @@ file_header_t *get_header_tar(FILE *tar_stream)
85 tar_entry = xcalloc(1, sizeof(file_header_t)); 92 tar_entry = xcalloc(1, sizeof(file_header_t));
86 tar_entry->name = xstrdup(tar.formated.name); 93 tar_entry->name = xstrdup(tar.formated.name);
87 94
88 parse_mode(tar.formated.mode, &tar_entry->mode); 95 tar_entry->mode = strtol(tar.formated.mode, NULL, 8);
96#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
97 switch (tar.formated.typeflag) {
98 case 0:
99 tar_entry->mode |= S_IFREG;
100 break;
101 case 1:
102 error_msg("internal hard link not handled\n");
103 break;
104 case 2:
105 tar_entry->mode |= S_IFLNK;
106 break;
107 case 3:
108 tar_entry->mode |= S_IFCHR;
109 break;
110 case 4:
111 tar_entry->mode |= S_IFBLK;
112 break;
113 case 5:
114 tar_entry->mode |= S_IFDIR;
115 break;
116 case 6:
117 tar_entry->mode |= S_IFIFO;
118 break;
119 }
120#endif
89 tar_entry->uid = strtol(tar.formated.uid, NULL, 8); 121 tar_entry->uid = strtol(tar.formated.uid, NULL, 8);
90 tar_entry->gid = strtol(tar.formated.gid, NULL, 8); 122 tar_entry->gid = strtol(tar.formated.gid, NULL, 8);
91 tar_entry->size = strtol(tar.formated.size, NULL, 8); 123 tar_entry->size = strtol(tar.formated.size, NULL, 8);