svn commit: trunk/busybox: archival archival/libunarchive include

vda at busybox.net vda at busybox.net
Sat Jun 28 05:04:09 UTC 2008


Author: vda
Date: 2008-06-27 22:04:09 -0700 (Fri, 27 Jun 2008)
New Revision: 22548

Log:
libunarchive: stop using static data in archivers - archive_handle_t
 can trivially provide space for that.
rpm: code shrink
tar: simplify autodetection of bz2/.gz


function                                             old     new   delta
static.not_first                                       1       -      -1
static.end                                             1       -      -1
bb_makedev                                            51      49      -2
static.saved_hardlinks_created                         4       -      -4
static.saved_hardlinks                                 4       -      -4
longname                                               4       -      -4
linkname                                               4       -      -4
hash_file                                            251     247      -4
get_header_tar                                      1528    1521      -7
rpm_main                                            1711    1697     -14
get_header_cpio                                      965     944     -21
------------------------------------------------------------------------------
(add/remove: 0/6 grow/shrink: 0/5 up/down: 0/-66)             Total: -66 bytes
   text    data     bss     dec     hex filename
 804926     611    6868  812405   c6575 busybox_old
 804878     611    6852  812341   c6535 busybox_unstripped



Modified:
   trunk/busybox/archival/ar.c
   trunk/busybox/archival/cpio.c
   trunk/busybox/archival/dpkg.c
   trunk/busybox/archival/libunarchive/data_extract_all.c
   trunk/busybox/archival/libunarchive/get_header_ar.c
   trunk/busybox/archival/libunarchive/get_header_cpio.c
   trunk/busybox/archival/libunarchive/get_header_tar.c
   trunk/busybox/archival/libunarchive/get_header_tar_lzma.c
   trunk/busybox/archival/rpm.c
   trunk/busybox/archival/tar.c
   trunk/busybox/include/unarchive.h


Changeset:
Modified: trunk/busybox/archival/ar.c
===================================================================
--- trunk/busybox/archival/ar.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/ar.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -63,7 +63,7 @@
 		archive_handle->action_data = data_extract_all;
 	}
 	if (opt & AR_OPT_PRESERVE_DATE) {
-		archive_handle->flags |= ARCHIVE_PRESERVE_DATE;
+		archive_handle->ah_flags |= ARCHIVE_PRESERVE_DATE;
 	}
 	if (opt & AR_OPT_VERBOSE) {
 		archive_handle->action_header = header_verbose_list_ar;

Modified: trunk/busybox/archival/cpio.c
===================================================================
--- trunk/busybox/archival/cpio.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/cpio.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -204,7 +204,7 @@
 	archive_handle = init_handle();
 	archive_handle->src_fd = STDIN_FILENO;
 	archive_handle->seek = seek_by_read;
-	archive_handle->flags = ARCHIVE_EXTRACT_NEWER;
+	archive_handle->ah_flags = ARCHIVE_EXTRACT_NEWER;
 
 #if ENABLE_FEATURE_CPIO_O
 	opt = getopt32(argv, "ituvF:dmoH:", &cpio_filename, &cpio_fmt);
@@ -241,8 +241,8 @@
 		archive_handle->action_data = data_extract_all;
 	}
 	if (opt & CPIO_OPT_UNCONDITIONAL) {
-		archive_handle->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
-		archive_handle->flags &= ~ARCHIVE_EXTRACT_NEWER;
+		archive_handle->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
+		archive_handle->ah_flags &= ~ARCHIVE_EXTRACT_NEWER;
 	}
 	if (opt & CPIO_OPT_VERBOSE) {
 		if (archive_handle->action_header == header_list) {
@@ -256,10 +256,10 @@
 		archive_handle->seek = seek_by_jump;
 	}
 	if (opt & CPIO_OPT_CREATE_LEADING_DIR) {
-		archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS;
+		archive_handle->ah_flags |= ARCHIVE_CREATE_LEADING_DIRS;
 	}
 	if (opt & CPIO_OPT_PRESERVE_MTIME) {
-		archive_handle->flags |= ARCHIVE_PRESERVE_DATE;
+		archive_handle->ah_flags |= ARCHIVE_PRESERVE_DATE;
 	}
 
 	while (*argv) {

Modified: trunk/busybox/archival/dpkg.c
===================================================================
--- trunk/busybox/archival/dpkg.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/dpkg.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -1532,7 +1532,7 @@
 	archive_handle->sub_archive->filter = filter_accept_list;
 	archive_handle->sub_archive->action_data = data_extract_all_prefix;
 	archive_handle->sub_archive->buffer = info_prefix;
-	archive_handle->sub_archive->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
+	archive_handle->sub_archive->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
 	unpack_ar_archive(archive_handle);
 
 	/* Run the preinst prior to extracting */
@@ -1543,7 +1543,7 @@
 	init_archive_deb_data(archive_handle);
 	archive_handle->sub_archive->action_data = data_extract_all_prefix;
 	archive_handle->sub_archive->buffer = (char*)"/"; /* huh? */
-	archive_handle->sub_archive->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
+	archive_handle->sub_archive->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL;
 	unpack_ar_archive(archive_handle);
 
 	/* Create the list file */

Modified: trunk/busybox/archival/libunarchive/data_extract_all.c
===================================================================
--- trunk/busybox/archival/libunarchive/data_extract_all.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/libunarchive/data_extract_all.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -12,14 +12,14 @@
 	int dst_fd;
 	int res;
 
-	if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) {
+	if (archive_handle->ah_flags & ARCHIVE_CREATE_LEADING_DIRS) {
 		char *name = xstrdup(file_header->name);
 		bb_make_directory(dirname(name), -1, FILEUTILS_RECUR);
 		free(name);
 	}
 
 	/* Check if the file already exists */
-	if (archive_handle->flags & ARCHIVE_EXTRACT_UNCONDITIONAL) {
+	if (archive_handle->ah_flags & ARCHIVE_EXTRACT_UNCONDITIONAL) {
 		/* Remove the entry if it exists */
 		if (((file_header->mode & S_IFMT) != S_IFDIR)
 		 && (unlink(file_header->name) == -1)
@@ -29,7 +29,7 @@
 					file_header->name);
 		}
 	}
-	else if (archive_handle->flags & ARCHIVE_EXTRACT_NEWER) {
+	else if (archive_handle->ah_flags & ARCHIVE_EXTRACT_NEWER) {
 		/* Remove the existing entry if its older than the extracted entry */
 		struct stat statbuf;
 		if (lstat(file_header->name, &statbuf) == -1) {
@@ -38,7 +38,7 @@
 			}
 		}
 		else if (statbuf.st_mtime <= file_header->mtime) {
-			if (!(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
+			if (!(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) {
 				bb_error_msg("%s not created: newer or "
 					"same age file exists", file_header->name);
 			}
@@ -58,7 +58,7 @@
 	) {
 		/* hard link */
 		res = link(file_header->link_target, file_header->name);
-		if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
+		if ((res == -1) && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) {
 			bb_perror_msg("cannot create %slink "
 					"from %s to %s", "hard",
 					file_header->name,
@@ -78,7 +78,7 @@
 		case S_IFDIR:
 			res = mkdir(file_header->name, file_header->mode);
 			if ((res == -1) && (errno != EISDIR)
-			 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)
+			 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)
 			) {
 				bb_perror_msg("cannot make dir %s", file_header->name);
 			}
@@ -87,7 +87,7 @@
 			/* Symlink */
 			res = symlink(file_header->link_target, file_header->name);
 			if ((res == -1)
-			 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)
+			 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)
 			) {
 				bb_perror_msg("cannot create %slink "
 					"from %s to %s", "sym",
@@ -101,7 +101,7 @@
 		case S_IFIFO:
 			res = mknod(file_header->name, file_header->mode, file_header->device);
 			if ((res == -1)
-			 && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)
+			 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)
 			) {
 				bb_perror_msg("cannot create node %s", file_header->name);
 			}
@@ -111,7 +111,7 @@
 		}
 	}
 
-	if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_OWN)) {
+	if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_OWN)) {
 #if ENABLE_FEATURE_TAR_UNAME_GNAME
 		uid_t uid = file_header->uid;
 		gid_t gid = file_header->gid;
@@ -133,11 +133,11 @@
 		/* uclibc has no lchmod, glibc is even stranger -
 		 * it has lchmod which seems to do nothing!
 		 * so we use chmod... */
-		if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM)) {
+		if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_PERM)) {
 			chmod(file_header->name, file_header->mode);
 		}
 		/* same for utime */
-		if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) {
+		if (archive_handle->ah_flags & ARCHIVE_PRESERVE_DATE) {
 			struct utimbuf t;
 			t.actime = t.modtime = file_header->mtime;
 			utime(file_header->name, &t);

Modified: trunk/busybox/archival/libunarchive/get_header_ar.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_ar.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/libunarchive/get_header_ar.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -110,7 +110,7 @@
 		archive_handle->action_header(typed);
 		if (archive_handle->sub_archive) {
 			while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS)
-				/* repeat */;
+				continue;
 		} else {
 			archive_handle->action_data(archive_handle);
 		}

Modified: trunk/busybox/archival/libunarchive/get_header_cpio.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_cpio.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/libunarchive/get_header_cpio.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -19,9 +19,6 @@
 
 char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle)
 {
-	static hardlinks_t *saved_hardlinks = NULL;
-	static hardlinks_t *saved_hardlinks_created = NULL;
-
 	file_header_t *file_header = archive_handle->file_header;
 	char cpio_header[110];
 	char dummy[16];
@@ -29,6 +26,14 @@
 	int major, minor, nlink, mode, inode;
 	unsigned size, uid, gid, mtime;
 
+#define saved_hardlinks         (*(hardlinks_t **)(&archive_handle->ah_priv[0]))
+#define saved_hardlinks_created (*(hardlinks_t **)(&archive_handle->ah_priv[1]))
+//	if (!archive_handle->ah_priv_inited) {
+//		archive_handle->ah_priv_inited = 1;
+//		saved_hardlinks = NULL;
+//		saved_hardlinks_created = NULL;
+//	}
+
 	/* There can be padding before archive header */
 	data_align(archive_handle, 4);
 

Modified: trunk/busybox/archival/libunarchive/get_header_tar.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_tar.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/libunarchive/get_header_tar.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -14,26 +14,13 @@
 #include "libbb.h"
 #include "unarchive.h"
 
-#if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
-static char *longname;
-static char *linkname;
-#else
-enum {
-	longname = 0,
-	linkname = 0,
-};
-#endif
-
 /* NB: _DESTROYS_ str[len] character! */
 static unsigned long long getOctal(char *str, int len)
 {
 	unsigned long long v;
-	/* Actually, tar header allows leading spaces also.
-	 * Oh well, we will be liberal and skip this...
-	 * The only downside probably is that we allow "-123" too :)
-	if (*str < '0' || *str > '7')
-		bb_error_msg_and_die("corrupted octal value in tar header");
-	*/
+	/* NB: leading spaces are allowed. Using strtoull to handle that.
+	 * The downside is that we accept e.g. "-123" too :)
+	 */
 	str[len] = '\0';
 	v = strtoull(str, &str, 8);
 	if (*str && (!ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY || *str != ' '))
@@ -45,11 +32,6 @@
 void BUG_tar_header_size(void);
 char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
 {
-	static smallint end;
-#if ENABLE_FEATURE_TAR_AUTODETECT
-	static smallint not_first;
-#endif
-
 	file_header_t *file_header = archive_handle->file_header;
 	struct {
 		/* ustar header, Posix 1003.1 */
@@ -65,7 +47,7 @@
 		/* POSIX:   "ustar" NUL "00" */
 		/* GNU tar: "ustar  " NUL */
 		/* Normally it's defined as magic[6] followed by
-		 * version[2], but we put them together to save code.
+		 * version[2], but we put them together to simplify code
 		 */
 		char magic[8];      /* 257-264 */
 		char uname[32];     /* 265-296 */
@@ -82,6 +64,22 @@
 #endif
 	int parse_names;
 
+	/* Our "private data" */
+#define p_end (*(smallint *)(&archive_handle->ah_priv[0]))
+#if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
+#define p_longname (*(char* *)(&archive_handle->ah_priv[1]))
+#define p_linkname (*(char* *)(&archive_handle->ah_priv[2]))
+#else
+#define p_longname 0
+#define p_linkname 0
+#endif
+//	if (!archive_handle->ah_priv_inited) {
+//		archive_handle->ah_priv_inited = 1;
+//		p_end = 0;
+//		USE_FEATURE_TAR_GNU_EXTENSIONS(p_longname = NULL;)
+//		USE_FEATURE_TAR_GNU_EXTENSIONS(p_linkname = NULL;)
+//	}
+
 	if (sizeof(tar) != 512)
 		BUG_tar_header_size();
 
@@ -95,7 +93,7 @@
 
 #if ENABLE_DESKTOP
 	i = full_read(archive_handle->src_fd, &tar, 512);
-	/* if GNU tar sees EOF in above read, it says:
+	/* If GNU tar sees EOF in above read, it says:
 	 * "tar: A lone zero block at N", where N = kilobyte
 	 * where EOF was met (not EOF block, actual EOF!),
 	 * and tar will exit with error code 0.
@@ -113,18 +111,18 @@
 
 	/* If there is no filename its an empty header */
 	if (tar.name[0] == 0 && tar.prefix[0] == 0) {
-		if (end) {
-			/* This is the second consecutive empty header! End of archive!
+		if (p_end) {
+			/* Second consecutive empty header - end of archive.
 			 * Read until the end to empty the pipe from gz or bz2
 			 */
 			while (full_read(archive_handle->src_fd, &tar, 512) == 512)
 				continue;
 			return EXIT_FAILURE;
 		}
-		end = 1;
+		p_end = 1;
 		return EXIT_SUCCESS;
 	}
-	end = 0;
+	p_end = 0;
 
 	/* Check header has valid magic, "ustar" is for the proper tar,
 	 * five NULs are for the old tar format  */
@@ -136,12 +134,10 @@
 		char FAST_FUNC (*get_header_ptr)(archive_handle_t *);
 
 		/* tar gz/bz autodetect: check for gz/bz2 magic.
-		 * If it is the very first block, and we see the magic,
+		 * If we see the magic, and it is the very first block,
 		 * we can switch to get_header_tar_gz/bz2/lzma().
 		 * Needs seekable fd. I wish recv(MSG_PEEK) works
 		 * on any fd... */
-		if (not_first)
-			goto err;
 #if ENABLE_FEATURE_TAR_GZIP
 		if (tar.name[0] == 0x1f && tar.name[1] == (char)0x8b) { /* gzip */
 			get_header_ptr = get_header_tar_gz;
@@ -155,6 +151,9 @@
 		} else
 #endif
 			goto err;
+		/* Two different causes for lseek() != 0:
+		 * unseekable fd (would like to support that too, but...),
+		 * or not first block (false positive, it's not .gz/.bz2!) */
 		if (lseek(archive_handle->src_fd, -512, SEEK_CUR) != 0)
 			goto err;
 		while (get_header_ptr(archive_handle) == EXIT_SUCCESS)
@@ -165,10 +164,6 @@
 		bb_error_msg_and_die("invalid tar magic");
 	}
 
-#if ENABLE_FEATURE_TAR_AUTODETECT
-	not_first = 1;
-#endif
-
 	/* Do checksum on headers.
 	 * POSIX says that checksum is done on unsigned bytes, but
 	 * Sun and HP-UX gets it wrong... more details in
@@ -219,7 +214,7 @@
 		tar.prefix[0] = t;
 	}
 	file_header->link_target = NULL;
-	if (!linkname && parse_names && tar.linkname[0]) {
+	if (!p_linkname && parse_names && tar.linkname[0]) {
 		file_header->link_target = xstrndup(tar.linkname, sizeof(tar.linkname));
 		/* FIXME: what if we have non-link object with link_target? */
 		/* Will link_target be free()ed? */
@@ -236,7 +231,7 @@
 	file_header->mode = 07777 & GET_OCTAL(tar.mode);
 
 	file_header->name = NULL;
-	if (!longname && parse_names) {
+	if (!p_longname && parse_names) {
 		/* we trash mode[0] here, it's ok */
 		//tar.name[sizeof(tar.name)] = '\0'; - gcc 4.3.0 would complain
 		tar.mode[0] = '\0';
@@ -284,20 +279,20 @@
 #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
 	case 'L':
 		/* free: paranoia: tar with several consecutive longnames */
-		free(longname);
+		free(p_longname);
 		/* For paranoia reasons we allocate extra NUL char */
-		longname = xzalloc(file_header->size + 1);
+		p_longname = xzalloc(file_header->size + 1);
 		/* We read ASCIZ string, including NUL */
-		xread(archive_handle->src_fd, longname, file_header->size);
+		xread(archive_handle->src_fd, p_longname, file_header->size);
 		archive_handle->offset += file_header->size;
 		/* return get_header_tar(archive_handle); */
 		/* gcc 4.1.1 didn't optimize it into jump */
 		/* so we will do it ourself, this also saves stack */
 		goto again;
 	case 'K':
-		free(linkname);
-		linkname = xzalloc(file_header->size + 1);
-		xread(archive_handle->src_fd, linkname, file_header->size);
+		free(p_linkname);
+		p_linkname = xzalloc(file_header->size + 1);
+		xread(archive_handle->src_fd, p_linkname, file_header->size);
 		archive_handle->offset += file_header->size;
 		/* return get_header_tar(archive_handle); */
 		goto again;
@@ -324,13 +319,13 @@
 	}
 
 #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
-	if (longname) {
-		file_header->name = longname;
-		longname = NULL;
+	if (p_longname) {
+		file_header->name = p_longname;
+		p_longname = NULL;
 	}
-	if (linkname) {
-		file_header->link_target = linkname;
-		linkname = NULL;
+	if (p_linkname) {
+		file_header->link_target = p_linkname;
+		p_linkname = NULL;
 	}
 #endif
 	if (!strncmp(file_header->name, "/../"+1, 3)
@@ -349,7 +344,7 @@
 		/* Note that we kill the '/' only after action_header() */
 		/* (like GNU tar 1.15.1: verbose mode outputs "dir/dir/") */
 		if (cp) *cp = '\0';
-		archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
+		archive_handle->ah_flags |= ARCHIVE_EXTRACT_QUIET;
 		archive_handle->action_data(archive_handle);
 		llist_add_to(&(archive_handle->passed), file_header->name);
 	} else {

Modified: trunk/busybox/archival/libunarchive/get_header_tar_lzma.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_tar_lzma.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/libunarchive/get_header_tar_lzma.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -9,7 +9,7 @@
 #include "libbb.h"
 #include "unarchive.h"
 
-char FAST_FUNC get_header_tar_lzma(archive_handle_t * archive_handle)
+char FAST_FUNC get_header_tar_lzma(archive_handle_t *archive_handle)
 {
 	/* Can't lseek over pipes */
 	archive_handle->seek = seek_by_read;

Modified: trunk/busybox/archival/rpm.c
===================================================================
--- trunk/busybox/archival/rpm.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/rpm.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -202,10 +202,9 @@
 	archive_handle->seek = seek_by_read;
 	//archive_handle->action_header = header_list;
 	archive_handle->action_data = data_extract_all;
-	archive_handle->flags |= ARCHIVE_PRESERVE_DATE;
-	archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS;
+	archive_handle->ah_flags = ARCHIVE_PRESERVE_DATE | ARCHIVE_CREATE_LEADING_DIRS;
 	archive_handle->src_fd = fd;
-	archive_handle->offset = 0;
+	/*archive_handle->offset = 0; - init_handle() did it */
 
 	xread(archive_handle->src_fd, &magic, 2);
 #if BB_MMU

Modified: trunk/busybox/archival/tar.c
===================================================================
--- trunk/busybox/archival/tar.c	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/archival/tar.c	2008-06-28 05:04:09 UTC (rev 22548)
@@ -814,9 +814,9 @@
 
 	/* Initialise default values */
 	tar_handle = init_handle();
-	tar_handle->flags = ARCHIVE_CREATE_LEADING_DIRS
-	                  | ARCHIVE_PRESERVE_DATE
-	                  | ARCHIVE_EXTRACT_UNCONDITIONAL;
+	tar_handle->ah_flags = ARCHIVE_CREATE_LEADING_DIRS
+	                     | ARCHIVE_PRESERVE_DATE
+	                     | ARCHIVE_EXTRACT_UNCONDITIONAL;
 
 	/* Prepend '-' to the first argument if required */
 	opt_complementary = "--:" // first arg is options
@@ -862,13 +862,13 @@
 		tar_handle->action_data = data_extract_to_stdout;
 
 	if (opt & OPT_KEEP_OLD)
-		tar_handle->flags &= ~ARCHIVE_EXTRACT_UNCONDITIONAL;
+		tar_handle->ah_flags &= ~ARCHIVE_EXTRACT_UNCONDITIONAL;
 
 	if (opt & OPT_NOPRESERVE_OWN)
-		tar_handle->flags |= ARCHIVE_NOPRESERVE_OWN;
+		tar_handle->ah_flags |= ARCHIVE_NOPRESERVE_OWN;
 
 	if (opt & OPT_NOPRESERVE_PERM)
-		tar_handle->flags |= ARCHIVE_NOPRESERVE_PERM;
+		tar_handle->ah_flags |= ARCHIVE_NOPRESERVE_PERM;
 
 	if (opt & OPT_GZIP)
 		get_header_ptr = get_header_tar_gz;

Modified: trunk/busybox/include/unarchive.h
===================================================================
--- trunk/busybox/include/unarchive.h	2008-06-28 04:58:55 UTC (rev 22547)
+++ trunk/busybox/include/unarchive.h	2008-06-28 05:04:09 UTC (rev 22548)
@@ -30,7 +30,7 @@
 } file_header_t;
 
 typedef struct archive_handle_t {
-	/* define if the header and data component should be processed */
+	/* Define if the header and data component should be processed */
 	char FAST_FUNC (*filter)(struct archive_handle_t *);
 	llist_t *accept;
 	/* List of files that have been rejected */
@@ -41,10 +41,10 @@
 	/* Contains the processed header entry */
 	file_header_t *file_header;
 
-	/* process the header component, e.g. tar -t */
+	/* Process the header component, e.g. tar -t */
 	void FAST_FUNC (*action_header)(const file_header_t *);
 
-	/* process the data component, e.g. extract to filesystem */
+	/* Process the data component, e.g. extract to filesystem */
 	void FAST_FUNC (*action_data)(struct archive_handle_t *);
 
 	/* How to process any sub archive, e.g. get_header_tar_gz */
@@ -66,8 +66,12 @@
 	char *buffer;
 
 	/* Flags and misc. stuff */
-	unsigned char flags;
+	unsigned char ah_flags;
 
+	/* "Private" storage for archivers */
+//	unsigned char ah_priv_inited;
+	void *ah_priv[8];
+
 } archive_handle_t;
 
 




More information about the busybox-cvs mailing list