diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-09-15 16:54:49 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-09-15 16:54:49 +0000 |
commit | b3c4e9add527fb03e20998679a049f84cbe12ac7 (patch) | |
tree | 43650dec389afa4c081c3acbae01b1e5c0574187 | |
parent | 186685d46fa6a15a328509543bb354d43bc719b0 (diff) | |
download | busybox-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.in | 1 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar.c | 49 |
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 | ||
23 | fi | 24 | fi |
24 | if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then | 25 | if [ "$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 | } |