Add extra comments, freakout if a pax archive is encoutered.

This commit is contained in:
Glenn L McGrath 2004-02-19 08:48:30 +00:00
parent e7d244cc96
commit b0e163a93b

View File

@ -16,6 +16,11 @@
* FIXME: Better checking required in oldcompatability mode,
* the file db.1.85.tar.gz from sleepycat.com has trailing garbage
* GNU tar can handle it, busybox tar reports invalid tar header.
*
* References:
* GNU tar and star man pages,
* Opengroup's ustar interchange format,
* http://www.opengroup.org/onlinepubs/007904975/utilities/pax.html
*/
#include <stdio.h>
@ -122,6 +127,14 @@ extern char get_header_tar(archive_handle_t *archive_handle)
/* Fix mode, used by the old format */
switch (tar.formated.typeflag) {
/* busybox identifies hard links as being regular files with 0 size and a link name */
case '1':
file_header->mode &= (S_IFREG | 07777);
break;
case 'x':
case 'g':
bb_error_msg_and_die("pax is not tar");
break;
#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
case 0:
case '0':
@ -146,11 +159,11 @@ extern char get_header_tar(archive_handle_t *archive_handle)
case '6':
file_header->mode |= S_IFIFO;
break;
#endif
/* hard links are detected as regular files with 0 size and a link name */
case '1':
file_header->mode &= (S_IFREG | 07777);
case '7':
/* Reserved for high performance files, treat as normal file */
file_header->mode |= S_IFREG;
break;
#endif
#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
case 'L': {
longname = xmalloc(file_header->size + 1);
@ -169,13 +182,15 @@ extern char get_header_tar(archive_handle_t *archive_handle)
file_header->name = linkname;
return(get_header_tar(archive_handle));
}
case 'D':
case 'M':
case 'N':
case 'S':
case 'V':
case 'D': /* GNU dump dir */
case 'M': /* Continuation of multi volume archive*/
case 'N': /* Old GNU for names > 100 characters */
case 'S': /* Sparse file */
case 'V': /* Volume header */
bb_error_msg("Ignoring GNU extension type %c", tar.formated.typeflag);
#endif
default:
bb_error_msg("Unknown typeflag: 0x%x", tar.formated.typeflag);
}
{ /* Strip trailing '/' in directories */
/* Must be done after mode is set as '/' is used to check if its a directory */