summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2002-09-15 16:54:49 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2002-09-15 16:54:49 +0000
commitb3c4e9add527fb03e20998679a049f84cbe12ac7 (patch)
tree43650dec389afa4c081c3acbae01b1e5c0574187
parent186685d46fa6a15a328509543bb354d43bc719b0 (diff)
downloadbusybox-w32-b3c4e9add527fb03e20998679a049f84cbe12ac7.tar.gz
busybox-w32-b3c4e9add527fb03e20998679a049f84cbe12ac7.tar.bz2
busybox-w32-b3c4e9add527fb03e20998679a049f84cbe12ac7.zip
Support for GNU style long filename and linknames
-rw-r--r--archival/config.in1
-rw-r--r--archival/libunarchive/get_header_tar.c49
2 files changed, 40 insertions, 10 deletions
diff --git a/archival/config.in b/archival/config.in
index 140e4fb76..3de671514 100644
--- a/archival/config.in
+++ b/archival/config.in
@@ -20,6 +20,7 @@ if [ "$CONFIG_TAR" = "y" ] ; then
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 22 bool ' Enable support for old tar header format' CONFIG_FEATURE_TAR_OLD_FORMAT
23 bool ' Enable support for GNU long filenames' CONFIG_FEATURE_GNUTAR_LONG_FILENAME
23fi 24fi
24if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then 25if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
25 bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE 26 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 38fb04070..e6747b72f 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -97,8 +97,19 @@ file_header_t *get_header_tar(FILE * tar_stream)
97 } 97 }
98 98
99 tar_entry->mode = strtol(tar.formated.mode, NULL, 8); 99 tar_entry->mode = strtol(tar.formated.mode, NULL, 8);
100#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT 100 tar_entry->uid = strtol(tar.formated.uid, NULL, 8);
101 tar_entry->gid = strtol(tar.formated.gid, NULL, 8);
102 tar_entry->size = strtol(tar.formated.size, NULL, 8);
103 tar_entry->mtime = strtol(tar.formated.mtime, NULL, 8);
104 tar_entry->link_name =
105 strlen(tar.formated.linkname) ? xstrdup(tar.formated.linkname) : NULL;
106 tar_entry->device =
107 (dev_t) ((strtol(tar.formated.devmajor, NULL, 8) << 8) +
108 strtol(tar.formated.devminor, NULL, 8));
109
110#if defined CONFIG_FEATURE_TAR_OLD_FORMAT || defined CONFIG_FEATURE_GNUTAR_LONG_FILENAME
101 switch (tar.formated.typeflag) { 111 switch (tar.formated.typeflag) {
112# ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
102 case 0: 113 case 0:
103 tar_entry->mode |= S_IFREG; 114 tar_entry->mode |= S_IFREG;
104 break; 115 break;
@@ -120,17 +131,35 @@ file_header_t *get_header_tar(FILE * tar_stream)
120 case 6: 131 case 6:
121 tar_entry->mode |= S_IFIFO; 132 tar_entry->mode |= S_IFIFO;
122 break; 133 break;
134# endif
135# ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
136 case 'L': {
137 char *longname;
138
139 longname = xmalloc(tar_entry->size + 1);
140 fread(longname, 1, tar_entry->size, tar_stream);
141 archive_offset += tar_entry->size;
142 longname[tar_entry->size] = '\0';
143
144 tar_entry = get_header_tar(tar_stream);
145 tar_entry->name = longname;
146 break;
147 }
148 case 'K': {
149 char *longname;
150
151 longname = xmalloc(tar_entry->size + 1);
152 fread(longname, 1, tar_entry->size, tar_stream);
153 archive_offset += tar_entry->size;
154 longname[tar_entry->size] = '\0';
155
156 tar_entry = get_header_tar(tar_stream);
157 tar_entry->link_name = longname;
158 break;
159 }
160# endif
123 } 161 }
124#endif 162#endif
125 tar_entry->uid = strtol(tar.formated.uid, NULL, 8);
126 tar_entry->gid = strtol(tar.formated.gid, NULL, 8);
127 tar_entry->size = strtol(tar.formated.size, NULL, 8);
128 tar_entry->mtime = strtol(tar.formated.mtime, NULL, 8);
129 tar_entry->link_name =
130 strlen(tar.formated.linkname) ? xstrdup(tar.formated.linkname) : NULL;
131 tar_entry->device =
132 (dev_t) ((strtol(tar.formated.devmajor, NULL, 8) << 8) +
133 strtol(tar.formated.devminor, NULL, 8));
134 163
135 return (tar_entry); 164 return (tar_entry);
136} 165}