Enable support for the old tar header format, enable via menu's

This commit is contained in:
Glenn L McGrath 2002-08-13 05:06:43 +00:00
parent 6069441bd2
commit 1d23f3a492
2 changed files with 38 additions and 5 deletions

View File

@ -18,7 +18,8 @@ bool 'tar' CONFIG_TAR
if [ "$CONFIG_TAR" = "y" ] ; then
bool ' Enable archive creation' CONFIG_FEATURE_TAR_CREATE
bool ' Enable -X and --exclude options (exclude files)' CONFIG_FEATURE_TAR_EXCLUDE
bool ' Enable -z option' CONFIG_FEATURE_TAR_GZIP
bool ' Enable -z option' CONFIG_FEATURE_TAR_GZIP
bool ' Enable support for old tar header format' CONFIG_FEATURE_TAR_OLD_FORMAT
fi
if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE

View File

@ -60,11 +60,18 @@ file_header_t *get_header_tar(FILE *tar_stream)
}
archive_offset += 512;
/* Check header has valid magic, unfortunately some tar files
* have empty (0'ed) tar entries at the end, which will
* cause this to fail, so fail silently for now
/* Check header has valid magic, "ustar" is for the proper tar
* 0's are for the old tar format
*/
if (strncmp(tar.formated.magic, "ustar", 5) != 0) {
#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
if (strncmp(tar.formated.magic, "\0\0\0\0\0", 5) != 0)
#endif
return(NULL);
}
/* If there is no filename its an empty header, skip it */
if (xstrlen(tar.formated.name) == 0) {
return(NULL);
}
@ -85,7 +92,32 @@ file_header_t *get_header_tar(FILE *tar_stream)
tar_entry = xcalloc(1, sizeof(file_header_t));
tar_entry->name = xstrdup(tar.formated.name);
parse_mode(tar.formated.mode, &tar_entry->mode);
tar_entry->mode = strtol(tar.formated.mode, NULL, 8);
#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
switch (tar.formated.typeflag) {
case 0:
tar_entry->mode |= S_IFREG;
break;
case 1:
error_msg("internal hard link not handled\n");
break;
case 2:
tar_entry->mode |= S_IFLNK;
break;
case 3:
tar_entry->mode |= S_IFCHR;
break;
case 4:
tar_entry->mode |= S_IFBLK;
break;
case 5:
tar_entry->mode |= S_IFDIR;
break;
case 6:
tar_entry->mode |= S_IFIFO;
break;
}
#endif
tar_entry->uid = strtol(tar.formated.uid, NULL, 8);
tar_entry->gid = strtol(tar.formated.gid, NULL, 8);
tar_entry->size = strtol(tar.formated.size, NULL, 8);