summaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2002-11-23 10:44:47 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2002-11-23 10:44:47 +0000
commitb7a76df4d1146940e10fd643828bcc53a824b6aa (patch)
tree1cd0eae04da9abc6431ebda8f300072d7f0f504e /archival
parent1b16bf6b1bd624ef37bb9289cfc9fef266aa1707 (diff)
downloadbusybox-w32-b7a76df4d1146940e10fd643828bcc53a824b6aa.tar.gz
busybox-w32-b7a76df4d1146940e10fd643828bcc53a824b6aa.tar.bz2
busybox-w32-b7a76df4d1146940e10fd643828bcc53a824b6aa.zip
Fix long filename support
Diffstat (limited to 'archival')
-rw-r--r--archival/libunarchive/get_header_tar.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index d3ff1608a..37e33d4c3 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -20,6 +20,11 @@
20#include "unarchive.h" 20#include "unarchive.h"
21#include "libbb.h" 21#include "libbb.h"
22 22
23#ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
24static char *longname = NULL;
25static char *linkname = NULL;
26#endif
27
23extern char get_header_tar(archive_handle_t *archive_handle) 28extern char get_header_tar(archive_handle_t *archive_handle)
24{ 29{
25 file_header_t *file_header = archive_handle->file_header; 30 file_header_t *file_header = archive_handle->file_header;
@@ -85,7 +90,16 @@ extern char get_header_tar(archive_handle_t *archive_handle)
85 return(EXIT_FAILURE); 90 return(EXIT_FAILURE);
86 } 91 }
87 92
88 /* convert to type'ed variables */ 93#ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
94 if (longname) {
95 file_header->name = longname;
96 longname = NULL;
97 }
98 else if (linkname) {
99 file_header->name = linkname;
100 linkname = NULL;
101 } else
102#endif
89 if (tar.formated.prefix[0] == 0) { 103 if (tar.formated.prefix[0] == 0) {
90 file_header->name = strdup(tar.formated.name); 104 file_header->name = strdup(tar.formated.name);
91 } else { 105 } else {
@@ -134,28 +148,21 @@ extern char get_header_tar(archive_handle_t *archive_handle)
134# endif 148# endif
135# ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME 149# ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
136 case 'L': { 150 case 'L': {
137 char *longname;
138
139 longname = xmalloc(file_header->size + 1); 151 longname = xmalloc(file_header->size + 1);
140 archive_xread_all(archive_handle, longname, file_header->size); 152 archive_xread_all(archive_handle, longname, file_header->size);
141 longname[file_header->size] = '\0'; 153 longname[file_header->size] = '\0';
142 archive_handle->offset += file_header->size; 154 archive_handle->offset += file_header->size;
143 155
144 get_header_tar(archive_handle); 156 return(get_header_tar(archive_handle));
145 file_header->name = longname;
146 break;
147 } 157 }
148 case 'K': { 158 case 'K': {
149 char *linkname;
150
151 linkname = xmalloc(file_header->size + 1); 159 linkname = xmalloc(file_header->size + 1);
152 archive_xread_all(archive_handle, linkname, file_header->size); 160 archive_xread_all(archive_handle, linkname, file_header->size);
153 linkname[file_header->size] = '\0'; 161 linkname[file_header->size] = '\0';
154 archive_handle->offset += file_header->size; 162 archive_handle->offset += file_header->size;
155 163
156 get_header_tar(archive_handle);
157 file_header->name = linkname; 164 file_header->name = linkname;
158 break; 165 return(get_header_tar(archive_handle));
159 } 166 }
160# endif 167# endif
161 } 168 }