Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Dec 2008 16:21:20 GMT
From:      Anselm Strauss <strauss@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 154401 for review
Message-ID:  <200812091621.mB9GLKp1010431@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=154401

Change 154401 by strauss@strauss_silversurfer on 2008/12/09 16:20:34

	integrated latest changes from libarchive-portable

Affected files ...

.. //depot/projects/soc2008/strauss_libarchive/Makefile.am#13 integrate
.. //depot/projects/soc2008/strauss_libarchive/NEWS#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/configure.ac#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/Makefile#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/cmdline.c#9 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/config_freebsd.h#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/cpio.c#10 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/cpio.h#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/cpio_platform.h#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_t.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_tv.stdout.uu#3 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/Makefile#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive.h#9 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_check_magic.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_endian.h#5 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.h#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_platform.h#10 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_private.h#5 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_private.h#4 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_all.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_bzip2.c#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_compress.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_gzip.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_lzma.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_none.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_program.c#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_ar.c#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_cpio.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_empty.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_iso9660.c#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_mtree.c#9 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_tar.c#9 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_zip.c#10 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_string.c#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_string.h#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_disk.c#10 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/Makefile#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_acl_freebsd.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_bzip2.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_bzip2_1.tbz.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_bzip2_2.tbz.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_gzip.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_gzip_1.tgz.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_compat_gzip_2.tgz.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_fuzz.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_fuzz_1.iso.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_read_format_cpio_bin_bz2.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_read_format_gtar_sparse.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_read_pax_truncated.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_write_disk_perms.c#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_write_format_cpio.c#6 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/Makefile#8 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/cmdline.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/config_freebsd.h#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/test/Makefile#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/test/test_strip_components.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/tar/tree.c#5 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/tree.h#3 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/util.c#7 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/write.c#10 integrate
.. //depot/projects/soc2008/strauss_libarchive/version#5 integrate
.. //depot/projects/soc2008/strauss_libarchive/windows/vc90/libarchive.vcproj#2 integrate

Differences ...

==== //depot/projects/soc2008/strauss_libarchive/Makefile.am#13 (text+ko) ====

@@ -182,11 +182,14 @@
 	libarchive/test/test_acl_pax.c				\
 	libarchive/test/test_archive_api_feature.c		\
 	libarchive/test/test_bad_fd.c				\
+	libarchive/test/test_compat_bzip2.c			\
 	libarchive/test/test_compat_gtar.c			\
+	libarchive/test/test_compat_gzip.c			\
 	libarchive/test/test_compat_tar_hardlink.c		\
 	libarchive/test/test_compat_zip.c			\
 	libarchive/test/test_empty_write.c			\
 	libarchive/test/test_entry.c				\
+	libarchive/test/test_fuzz.c				\
 	libarchive/test/test_entry_strmode.c			\
 	libarchive/test/test_link_resolver.c			\
 	libarchive/test/test_pax_filename_encoding.c		\
@@ -255,9 +258,14 @@
 libarchive_TESTS_ENVIRONMENT= LIBARCHIVE_TEST_FILES=`cd $(top_srcdir);/bin/pwd`/libarchive/test
 
 libarchive_test_EXTRA_DIST=\
+	libarchive/test/test_compat_bzip2_1.tbz.uu			\
+	libarchive/test/test_compat_bzip2_2.tbz.uu			\
 	libarchive/test/test_compat_gtar_1.tgz.uu			\
+	libarchive/test/test_compat_gzip_1.tgz.uu			\
+	libarchive/test/test_compat_gzip_2.tgz.uu			\
 	libarchive/test/test_compat_tar_hardlink_1.tar.uu		\
 	libarchive/test/test_compat_zip_1.zip.uu			\
+	libarchive/test/test_fuzz_1.iso.uu				\
 	libarchive/test/test_pax_filename_encoding.tar.gz.uu		\
 	libarchive/test/test_read_format_gtar_sparse_1_13.tgz.uu	\
 	libarchive/test/test_read_format_gtar_sparse_1_17.tgz.uu	\
@@ -329,6 +337,7 @@
 	tar/test/test_option_T.c				\
 	tar/test/test_patterns.c				\
 	tar/test/test_stdio.c					\
+	tar/test/test_strip_components.c			\
 	tar/test/test_symlink_dir.c				\
 	tar/test/test_version.c
 

==== //depot/projects/soc2008/strauss_libarchive/NEWS#8 (text+ko) ====

@@ -1,3 +1,5 @@
+
+Dec 04, 2008: libarchive 2.5.903a released
 Nov 09, 2008: libarchive 2.5.902a released
 Nov 08, 2008: libarchive 2.5.901a released
 Nov 08, 2008: Start of pre-release testing for libarchive 2.6

==== //depot/projects/soc2008/strauss_libarchive/configure.ac#6 (text+ko) ====

@@ -4,8 +4,8 @@
 dnl In particular, this allows the version macro to be used in AC_INIT
 
 dnl These first two version numbers are updated automatically on each release.
-m4_define([LIBARCHIVE_VERSION_S],[2.5.902a])
-m4_define([LIBARCHIVE_VERSION_N],[2005902])
+m4_define([LIBARCHIVE_VERSION_S],[2.5.903a])
+m4_define([LIBARCHIVE_VERSION_N],[2005903])
 
 dnl bsdtar versioning tracks libarchive
 m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S())
@@ -162,17 +162,37 @@
 AC_HEADER_STDC
 AC_HEADER_DIRENT
 AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS([bzlib.h errno.h ext2fs/ext2_fs.h fcntl.h  grp.h])
+AC_CHECK_HEADERS([errno.h ext2fs/ext2_fs.h fcntl.h  grp.h])
 AC_CHECK_HEADERS([inttypes.h langinfo.h limits.h linux/fs.h])
-AC_CHECK_HEADERS([locale.h lzmadec.h paths.h poll.h pwd.h regex.h stdarg.h])
+AC_CHECK_HEADERS([locale.h paths.h poll.h pwd.h regex.h stdarg.h])
 AC_CHECK_HEADERS([stdint.h stdlib.h string.h sys/acl.h sys/ioctl.h])
 AC_CHECK_HEADERS([sys/param.h sys/poll.h sys/select.h sys/time.h sys/utime.h])
-AC_CHECK_HEADERS([time.h unistd.h utime.h wchar.h zlib.h])
+AC_CHECK_HEADERS([time.h unistd.h utime.h wchar.h])
 
 # Checks for libraries.
-AC_CHECK_LIB(bz2,BZ2_bzDecompressInit)
-AC_CHECK_LIB(z,inflate)
-AC_CHECK_LIB(lzmadec,lzmadec_decode)
+AC_ARG_WITH([zlib],
+  AS_HELP_STRING([--without-zlib], [Don't build support for gzip through zlib]))
+
+if test "x$with_zlib" != "xno"; then
+  AC_CHECK_HEADERS([zlib.h])
+  AC_CHECK_LIB(z,inflate)
+fi
+
+AC_ARG_WITH([bz2lib],
+  AS_HELP_STRING([--without-bz2lib], [Don't build support for bzip2 through bz2lib]))
+
+if test "x$with_bz2lib" != "xno"; then
+  AC_CHECK_HEADERS([bzlib.h])
+  AC_CHECK_LIB(bz2,BZ2_bzDecompressInit)
+fi
+
+AC_ARG_WITH([lzmadec],
+  AS_HELP_STRING([--without-lzmadec], [Don't build support for lzma through lzmadec]))
+
+if test "x$with_lzmadec" != "xno"; then
+  AC_CHECK_HEADERS([lzmadec.h])
+  AC_CHECK_LIB(lzmadec,lzmadec_decode)
+fi
 
 # TODO: Give the user the option of using a pre-existing system
 # libarchive.  This will define HAVE_LIBARCHIVE which will cause

==== //depot/projects/soc2008/strauss_libarchive/cpio/Makefile#8 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/usr.bin/cpio/Makefile,v 1.5 2008/07/05 05:17:33 kientzle Exp $
+# $FreeBSD: src/usr.bin/cpio/Makefile,v 1.6 2008/12/06 07:30:40 kientzle Exp $
 
 .include <bsd.own.mk>
 

==== //depot/projects/soc2008/strauss_libarchive/cpio/cmdline.c#9 (ktext) ====

@@ -26,7 +26,7 @@
 
 
 #include "cpio_platform.h"
-__FBSDID("$FreeBSD: src/usr.bin/cpio/cmdline.c,v 1.4 2008/07/29 15:23:31 kientzle Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/cpio/cmdline.c,v 1.5 2008/12/06 07:30:40 kientzle Exp $");
 
 #ifdef HAVE_ERRNO_H
 #include <errno.h>

==== //depot/projects/soc2008/strauss_libarchive/cpio/config_freebsd.h#7 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.bin/cpio/config_freebsd.h,v 1.2 2008/07/05 05:15:07 kientzle Exp $
+ * $FreeBSD: src/usr.bin/cpio/config_freebsd.h,v 1.3 2008/12/06 07:30:40 kientzle Exp $
  */
 
 /* A default configuration for FreeBSD, used if there is no config.h. */

==== //depot/projects/soc2008/strauss_libarchive/cpio/cpio.c#10 (ktext) ====

@@ -26,7 +26,7 @@
 
 
 #include "cpio_platform.h"
-__FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.13 2008/09/04 05:20:46 kientzle Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.15 2008/12/06 07:30:40 kientzle Exp $");
 
 #include <sys/types.h>
 #include <archive.h>
@@ -41,6 +41,12 @@
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
 #ifdef HAVE_STDARG_H
 #include <stdarg.h>
 #endif
@@ -58,11 +64,32 @@
 #include "cpio.h"
 #include "matching.h"
 
+/* Fixed size of uname/gname caches. */
+#define	name_cache_size 101
+
+struct name_cache {
+	int	probes;
+	int	hits;
+	size_t	size;
+	struct {
+		id_t id;
+		char *name;
+	} cache[name_cache_size];
+};
+
 static int	copy_data(struct archive *, struct archive *);
 static const char *cpio_rename(const char *name);
 static int	entry_to_archive(struct cpio *, struct archive_entry *);
 static int	file_to_archive(struct cpio *, const char *);
+static void	free_cache(struct name_cache *cache);
+static void	list_item_verbose(struct cpio *, struct archive_entry *);
 static void	long_help(void);
+static const char *lookup_gname(struct cpio *, gid_t gid);
+static int	lookup_gname_helper(struct cpio *,
+		    const char **name, id_t gid);
+static const char *lookup_uname(struct cpio *, uid_t uid);
+static int	lookup_uname_helper(struct cpio *,
+		    const char **name, id_t uid);
 static void	mode_in(struct cpio *);
 static void	mode_list(struct cpio *);
 static void	mode_out(struct cpio *);
@@ -268,6 +295,8 @@
 		    "Must specify at least one of -i, -o, or -p");
 	}
 
+	free_cache(cpio->gname_cache);
+	free_cache(cpio->uname_cache);
 	return (0);
 }
 
@@ -798,18 +827,9 @@
 		}
 		if (excluded(cpio, archive_entry_pathname(entry)))
 			continue;
-		if (cpio->verbose) {
-			/* TODO: uname/gname lookups */
-			/* TODO: Clean this up. */
-			fprintf(stdout,
-			    "%s%3d %8s%8s " CPIO_FILESIZE_PRINTF " %s\n",
-			    archive_entry_strmode(entry),
-			    archive_entry_nlink(entry),
-			    archive_entry_uname(entry),
-			    archive_entry_gname(entry),
-			    (CPIO_FILESIZE_TYPE)archive_entry_size(entry),
-			    archive_entry_pathname(entry));
-		} else
+		if (cpio->verbose)
+			list_item_verbose(cpio, entry);
+		else
 			fprintf(stdout, "%s\n", archive_entry_pathname(entry));
 	}
 	r = archive_read_close(a);
@@ -825,7 +845,74 @@
 	exit(0);
 }
 
+/*
+ * Display information about the current file.
+ *
+ * The format here roughly duplicates the output of 'ls -l'.
+ * This is based on SUSv2, where 'tar tv' is documented as
+ * listing additional information in an "unspecified format,"
+ * and 'pax -l' is documented as using the same format as 'ls -l'.
+ */
 static void
+list_item_verbose(struct cpio *cpio, struct archive_entry *entry)
+{
+	char			 size[32];
+	char			 date[32];
+	const char 		*uname, *gname;
+	FILE			*out = stdout;
+	const struct stat	*st;
+	const char		*fmt;
+	time_t			 tim;
+	static time_t		 now;
+
+	st = archive_entry_stat(entry);
+
+	if (!now)
+		time(&now);
+
+	/* Use uname if it's present, else uid. */
+	uname = archive_entry_uname(entry);
+	if (uname == NULL)
+		uname = lookup_uname(cpio, archive_entry_uid(entry));
+
+	/* Use gname if it's present, else gid. */
+	gname = archive_entry_gname(entry);
+	if (gname == NULL)
+		gname = lookup_gname(cpio, archive_entry_gid(entry));
+
+	/* Print device number or file size. */
+	if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
+		snprintf(size, sizeof(size), "%lu,%lu",
+		    (unsigned long)major(st->st_rdev),
+		    (unsigned long)minor(st->st_rdev)); /* ls(1) also casts here. */
+	} else {
+		snprintf(size, sizeof(size), CPIO_FILESIZE_PRINTF,
+		    (CPIO_FILESIZE_TYPE)st->st_size);
+	}
+
+	/* Format the time using 'ls -l' conventions. */
+	tim = (time_t)st->st_mtime;
+	if (abs(tim - now) > (365/2)*86400)
+		fmt = cpio->day_first ? "%e %b  %Y" : "%b %e  %Y";
+	else
+		fmt = cpio->day_first ? "%e %b %H:%M" : "%b %e %H:%M";
+	strftime(date, sizeof(date), fmt, localtime(&tim));
+
+	fprintf(out, "%s%3d %-8s %-8s %8s %12s %s",
+	    archive_entry_strmode(entry),
+	    archive_entry_nlink(entry),
+	    uname, gname, size, date,
+	    archive_entry_pathname(entry));
+
+	/* Extra information for links. */
+	if (archive_entry_hardlink(entry)) /* Hard link */
+		fprintf(out, " link to %s", archive_entry_hardlink(entry));
+	else if (archive_entry_symlink(entry)) /* Symbolic link */
+		fprintf(out, " -> %s", archive_entry_symlink(entry));
+	fprintf(out, "\n");
+}
+
+static void
 mode_pass(struct cpio *cpio, const char *destdir)
 {
 	unsigned long blocks;
@@ -1033,3 +1120,123 @@
 	free(lr->pathname);
 	free(lr);
 }
+
+static void
+free_cache(struct name_cache *cache)
+{
+	size_t i;
+
+	if (cache != NULL) {
+		for (i = 0; i < cache->size; i++)
+			free(cache->cache[i].name);
+		free(cache);
+	}
+}
+
+/*
+ * Lookup uname/gname from uid/gid, return NULL if no match.
+ */
+static const char *
+lookup_name(struct cpio *cpio, struct name_cache **name_cache_variable,
+    int (*lookup_fn)(struct cpio *, const char **, id_t), id_t id)
+{
+	char asnum[16];
+	struct name_cache	*cache;
+	const char *name;
+	int slot;
+
+
+	if (*name_cache_variable == NULL) {
+		*name_cache_variable = malloc(sizeof(struct name_cache));
+		if (*name_cache_variable == NULL)
+			cpio_errc(1, ENOMEM, "No more memory");
+		memset(*name_cache_variable, 0, sizeof(struct name_cache));
+		(*name_cache_variable)->size = name_cache_size;
+	}
+
+	cache = *name_cache_variable;
+	cache->probes++;
+
+	slot = id % cache->size;
+	if (cache->cache[slot].name != NULL) {
+		if (cache->cache[slot].id == id) {
+			cache->hits++;
+			return (cache->cache[slot].name);
+		}
+		free(cache->cache[slot].name);
+		cache->cache[slot].name = NULL;
+	}
+
+	if (lookup_fn(cpio, &name, id) == 0) {
+		if (name == NULL || name[0] == '\0') {
+			/* If lookup failed, format it as a number. */
+			snprintf(asnum, sizeof(asnum), "%u", (unsigned)id);
+			name = asnum;
+		}
+		cache->cache[slot].name = strdup(name);
+		if (cache->cache[slot].name != NULL) {
+			cache->cache[slot].id = id;
+			return (cache->cache[slot].name);
+		}
+		/*
+		 * Conveniently, NULL marks an empty slot, so
+		 * if the strdup() fails, we've just failed to
+		 * cache it.  No recovery necessary.
+		 */
+	}
+	return (NULL);
+}
+
+static const char *
+lookup_uname(struct cpio *cpio, uid_t uid)
+{
+	return (lookup_name(cpio, &cpio->uname_cache,
+		    &lookup_uname_helper, (id_t)uid));
+}
+
+static int
+lookup_uname_helper(struct cpio *cpio, const char **name, id_t id)
+{
+	struct passwd	*pwent;
+
+	(void)cpio; /* UNUSED */
+
+	errno = 0;
+	pwent = getpwuid((uid_t)id);
+	if (pwent == NULL) {
+		*name = NULL;
+		if (errno != 0)
+			cpio_warnc(errno, "getpwuid(%d) failed", id);
+		return (errno);
+	}
+
+	*name = pwent->pw_name;
+	return (0);
+}
+
+static const char *
+lookup_gname(struct cpio *cpio, gid_t gid)
+{
+	return (lookup_name(cpio, &cpio->gname_cache,
+		    &lookup_gname_helper, (id_t)gid));
+}
+
+static int
+lookup_gname_helper(struct cpio *cpio, const char **name, id_t id)
+{
+	struct group	*grent;
+
+	(void)cpio; /* UNUSED */
+
+	errno = 0;
+	grent = getgrgid((gid_t)id);
+	if (grent == NULL) {
+		*name = NULL;
+		if (errno != 0)
+			cpio_warnc(errno, "getgrgid(%d) failed", id);
+		return (errno);
+	}
+
+	*name = grent->gr_name;
+	return (0);
+}

==== //depot/projects/soc2008/strauss_libarchive/cpio/cpio.h#6 (text+ko) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.bin/cpio/cpio.h,v 1.4 2008/08/04 01:25:48 cperciva Exp $
+ * $FreeBSD: src/usr.bin/cpio/cpio.h,v 1.7 2008/12/06 07:30:40 kientzle Exp $
  */
 
 #ifndef CPIO_H_INCLUDED
@@ -68,6 +68,7 @@
 	char		 *pass_destpath;
 	int		  uid_override;
 	int		  gid_override;
+	int		  day_first; /* true if locale prefers day/mon */
 
 	/* If >= 0, then close this when done. */
 	int		  fd;
@@ -79,6 +80,9 @@
 	int		  return_value; /* Value returned by main() */
 	struct archive_entry_linkresolver *linkresolver;
 
+	struct name_cache *uname_cache;
+	struct name_cache *gname_cache;
+
 	/* Work data. */
 	struct matching  *matching;
 	char		 *buff;

==== //depot/projects/soc2008/strauss_libarchive/cpio/cpio_platform.h#7 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD$
+ * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $
  */
 
 /*

==== //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_t.c#6 (ktext) ====

@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include "test.h"
-__FBSDID("$Id$ $Change: 142961 $ $DateTime$ $Author$");
+__FBSDID("$FreeBSD$");
 
 
 DEFINE_TEST(test_option_t)
@@ -43,5 +43,9 @@
 	assertEqualInt(r, 0);
 	assertFileContents("1 block\n", 8, "tv.err");
 	extract_reference_file("test_option_tv.stdout");
-	assertEqualFile("tv.out", "test_option_tv.stdout");
+
+	/* This doesn't work because the usernames on different systems
+	 * are different and cpio now looks up numeric UIDs on
+	 * the local system. */
+	/* assertEqualFile("tv.out", "test_option_tv.stdout"); */
 }

==== //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_tv.stdout.uu#3 (text+ko) ====

@@ -1,5 +1,6 @@
-$FreeBSD$
+$FreeBSD: src/usr.bin/cpio/test/test_option_tv.stdout.uu,v 1.2 2008/11/29 20:22:02 kientzle Exp $
 begin 644 test_option_tv.stdout
-G+7)W+7(M+7(M+2`@(#$@("`H;G5L;"D@("AN=6QL*2`P(&9I;&4*
+M+7)W+7(M+7(M+2`@(#$@=&EM("`@("`@=&EM("`@("`@("`@("`@(#`@1&5C
+/(#,Q("`Q.38Y(&9I;&4*
 `
 end

==== //depot/projects/soc2008/strauss_libarchive/libarchive/Makefile#8 (text+ko) ====

@@ -16,9 +16,6 @@
 # Headers to be installed in /usr/include
 INCS=	archive.h archive_entry.h
 
-# TODO: LZMA reader needs to be converted to the new filter architecture...
-#	archive_read_support_compression_lzma.c		\
-
 # Sources to be compiled.
 SRCS=	archive_check_magic.c				\
 	archive_entry.c					\

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive.h#9 (ktext) ====

@@ -113,13 +113,13 @@
  *             (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
  * #endif
  */
-#define	ARCHIVE_VERSION_NUMBER 2005902
+#define	ARCHIVE_VERSION_NUMBER 2005903
 __LA_DECL int		archive_version_number(void);
 
 /*
  * Textual name/version of the library, useful for version displays.
  */
-#define	ARCHIVE_VERSION_STRING "libarchive 2.5.902a"
+#define	ARCHIVE_VERSION_STRING "libarchive 2.5.903a"
 __LA_DECL const char *	archive_version_string(void);
 
 #if ARCHIVE_VERSION_NUMBER < 3000000

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_check_magic.c#6 (ktext) ====

@@ -24,7 +24,7 @@
  */
 
 #include "archive_platform.h"
-__FBSDID("$FreeBSD: src/lib/libarchive/archive_check_magic.c,v 1.8 2007/04/02 00:15:45 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/archive_check_magic.c,v 1.9 2008/12/06 05:52:01 kientzle Exp $");
 
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_endian.h#5 (ktext) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libarchive/archive_endian.h,v 1.3 2008/05/26 17:00:22 kientzle Exp $
+ * $FreeBSD: src/lib/libarchive/archive_endian.h,v 1.4 2008/12/06 06:12:24 kientzle Exp $
  *
  * Borrowed from FreeBSD's <sys/endian.h>
  */
@@ -41,8 +41,10 @@
  * - SGI MIPSpro
  * - Microsoft Visual C++ 6.0 (supposedly newer versions too)
  */
-#if defined(__WATCOMC__) || defined(__sgi) || defined(_MSC_VER)
+#if defined(__WATCOMC__) || defined(__sgi)
 #define	inline
+#elif defined(_MSC_VER)
+#define inline __inline
 #endif
 
 /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.h#7 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libarchive/archive_entry.h,v 1.30 2008/09/30 03:53:03 kientzle Exp $
+ * $FreeBSD: src/lib/libarchive/archive_entry.h,v 1.31 2008/12/06 06:18:46 kientzle Exp $
  */
 
 #ifndef ARCHIVE_ENTRY_H_INCLUDED
@@ -441,7 +441,7 @@
  * Note that archive_entry_size() is reset to zero if the file
  * body should not be written to the archive.  Pay attention!
  */
-__LA_DECL struct archive_entry_linkresolver;
+struct archive_entry_linkresolver;
 
 /*
  * There are three different strategies for marking hardlinks.

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_platform.h#10 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libarchive/archive_platform.h,v 1.31 2008/09/12 04:03:34 kientzle Exp $
+ * $FreeBSD: src/lib/libarchive/archive_platform.h,v 1.32 2008/12/06 05:53:05 kientzle Exp $
  */
 
 /*

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_private.h#5 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libarchive/archive_private.h,v 1.30 2008/08/04 01:25:48 cperciva Exp $
+ * $FreeBSD: src/lib/libarchive/archive_private.h,v 1.32 2008/12/06 06:23:37 kientzle Exp $
  */
 
 #ifndef ARCHIVE_PRIVATE_H_INCLUDED
@@ -40,13 +40,13 @@
 
 #define	ARCHIVE_WRITE_MAGIC	(0xb0c5c0deU)
 #define	ARCHIVE_READ_MAGIC	(0xdeb0c5U)
-#define ARCHIVE_WRITE_DISK_MAGIC (0xc001b0c5U)
+#define	ARCHIVE_WRITE_DISK_MAGIC (0xc001b0c5U)
 
 #define	ARCHIVE_STATE_ANY	0xFFFFU
 #define	ARCHIVE_STATE_NEW	1U
 #define	ARCHIVE_STATE_HEADER	2U
 #define	ARCHIVE_STATE_DATA	4U
-#define ARCHIVE_STATE_DATA_END	8U
+#define	ARCHIVE_STATE_DATA_END	8U
 #define	ARCHIVE_STATE_EOF	0x10U
 #define	ARCHIVE_STATE_CLOSED	0x20U
 #define	ARCHIVE_STATE_FATAL	0x8000U

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read.c#6 (ktext) ====

@@ -32,7 +32,7 @@
  */
 
 #include "archive_platform.h"
-__FBSDID("$FreeBSD: src/lib/libarchive/archive_read.c,v 1.38 2008/03/12 04:58:32 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/archive_read.c,v 1.39 2008/12/06 06:45:15 kientzle Exp $");
 
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
@@ -793,7 +793,8 @@
 	size_t tocopy;
 
 	if (a->fatal) {
-		*avail = ARCHIVE_FATAL;
+		if (avail)
+			*avail = ARCHIVE_FATAL;
 		return (NULL);
 	}
 
@@ -861,10 +862,7 @@
 				/* Return whatever we do have. */
 				if (avail != NULL)
 					*avail = a->avail;
-				return (a->next);
-				/* TODO: I want to change this to
-				 * return(0) as an eof marker, but a little
-				 * more work is needed first. */
+				return (NULL);
 			}
 			a->archive.raw_position += bytes_read;
 			a->client_total = bytes_read;

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_private.h#4 (ktext) ====

@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libarchive/archive_read_private.h,v 1.6 2008/03/15 11:09:16 kientzle Exp $
+ * $FreeBSD: src/lib/libarchive/archive_read_private.h,v 1.7 2008/12/06 06:45:15 kientzle Exp $
  */
 
 #ifndef ARCHIVE_READ_PRIVATE_H_INCLUDED

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_all.c#6 (ktext) ====

@@ -24,7 +24,7 @@
  */
 
 #include "archive_platform.h"
-__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_all.c,v 1.6 2007/01/09 08:05:55 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_all.c,v 1.7 2008/12/06 06:45:15 kientzle Exp $");
 
 #include "archive.h"
 

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_bzip2.c#7 (ktext) ====

@@ -25,7 +25,7 @@
 
 #include "archive_platform.h"
 
-__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_bzip2.c,v 1.18 2008/05/26 17:00:22 kientzle Exp $");
+__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_compression_bzip2.c,v 1.19 2008/12/06 06:45:15 kientzle Exp $");
 
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
@@ -53,7 +53,7 @@
 	bz_stream	 stream;
 	char		*out_block;
 	size_t		 out_block_size;
-	int64_t		 total_out;
+	char		 valid; /* True = decompressor is initialized */
 	char		 eof; /* True = found end of compressed data. */
 };
 
@@ -200,7 +200,6 @@
 	void *out_block;
 	struct archive_read_source *self;
 	struct private_data *state;
-	int ret;
 
 	(void)reader; /* UNUSED */
 
@@ -242,49 +241,7 @@
 	state->stream.next_out = state->out_block;
 	state->stream.avail_out = state->out_block_size;
 
-	/* Initialize compression library. */
-	ret = BZ2_bzDecompressInit(&(state->stream),
-	    0 /* library verbosity */,
-	    0 /* don't use slow low-mem algorithm */);
-
-	/* If init fails, try using low-memory algorithm instead. */
-	if (ret == BZ_MEM_ERROR) {
-		ret = BZ2_bzDecompressInit(&(state->stream),
-		    0 /* library verbosity */,
-		    1 /* do use slow low-mem algorithm */);
-	}
-
-	if (ret == BZ_OK)
-		return (self);
-
-	/* Library setup failed: Clean up. */
-	archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-	    "Internal error initializing %s library",
-	    a->archive.compression_name);
-
-	/* Override the error message if we know what really went wrong. */
-	switch (ret) {
-	case BZ_PARAM_ERROR:
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "Internal error initializing compression library: "
-		    "invalid setup parameter");
-		break;
-	case BZ_MEM_ERROR:
-		archive_set_error(&a->archive, ENOMEM,
-		    "Internal error initializing compression library: "
-		    "out of memory");
-		break;
-	case BZ_CONFIG_ERROR:
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "Internal error initializing compression library: "
-		    "mis-compiled library");
-		break;
-	}
-
-	free(state->out_block);
-	free(state);
-	free(self);
-	return (NULL);
+	return (self);
 }
 
 /*
@@ -301,6 +258,11 @@
 	state = (struct private_data *)self->data;
 	read_avail = 0;
 
+	if (state->eof) {
+		*p = NULL;
+		return (0);
+	}
+
 	/* Empty our output buffer. */
 	state->stream.next_out = state->out_block;
 	state->stream.avail_out = state->out_block_size;
@@ -319,39 +281,85 @@
 				return (ARCHIVE_FATAL);
 			/* There is no more data, return whatever we have. */
 			if (ret == 0) {
+				state->eof = 1;
 				*p = state->out_block;
 				decompressed = state->stream.next_out
 				    - state->out_block;
-				state->total_out += decompressed;
 				return (decompressed);
 			}
 			state->stream.avail_in = ret;
 		}
 
+		if (!state->valid) {
+			if (state->stream.next_in[0] != 'B') {
+				state->eof = 1;
+				*p = state->out_block;
+				decompressed = state->stream.next_out
+				    - state->out_block;
+				return (decompressed);
+			}
+			/* Initialize compression library. */
+			ret = BZ2_bzDecompressInit(&(state->stream),
+					   0 /* library verbosity */,
+					   0 /* don't use low-mem algorithm */);
+
+			/* If init fails, try low-memory algorithm instead. */
+			if (ret == BZ_MEM_ERROR)
+				ret = BZ2_bzDecompressInit(&(state->stream),
+					   0 /* library verbosity */,
+					   1 /* do use low-mem algo */);
+
+			if (ret != BZ_OK) {
+				const char *detail = NULL;
+				int err = ARCHIVE_ERRNO_MISC;
+				switch (ret) {
+				case BZ_PARAM_ERROR:
+					detail = "invalid setup parameter";
+					break;
+				case BZ_MEM_ERROR:
+					err = ENOMEM;
+					detail = "out of memory";
+					break;
+				case BZ_CONFIG_ERROR:
+					detail = "mis-compiled library";
+					break;
+				}
+				archive_set_error(&self->archive->archive, err,
+				    "Internal error initializing decompressor%s%s",
+				    detail == NULL ? "" : ": ",
+				    detail);
+				return (ARCHIVE_FATAL);
+			}
+			state->valid = 1;
+		}
+
 		/* Decompress as much as we can in one pass. */
 		ret = BZ2_bzDecompress(&(state->stream));
 		switch (ret) {
 		case BZ_STREAM_END: /* Found end of stream. */
-			/* TODO: Peek ahead to see if there's another
-			 * stream so we can mimic the behavior of gunzip
-			 * on concatenated streams. */
-			state->eof = 1;
+			switch (BZ2_bzDecompressEnd(&(state->stream))) {
+			case BZ_OK:
+				break;
+			default:
+				archive_set_error(&(self->archive->archive),
+					  ARCHIVE_ERRNO_MISC,
+					  "Failed to clean up decompressor");
+				return (ARCHIVE_FATAL);
+			}
+			state->valid = 0;
+			/* FALLTHROUGH */
 		case BZ_OK: /* Decompressor made some progress. */
 			/* If we filled our buffer, update stats and return. */
-			if (state->eof || state->stream.avail_out == 0) {
+			if (state->stream.avail_out == 0) {
 				*p = state->out_block;
 				decompressed = state->stream.next_out
 				    - state->out_block;
-				state->total_out += decompressed;
 				return (decompressed);
 			}
 			break;
-		default:
-			/* Return an error. */
+		default: /* Return an error. */
 			archive_set_error(&self->archive->archive,
-			    ARCHIVE_ERRNO_MISC,
-			    "%s decompression failed",
-			    self->archive->archive.compression_name);
+			    ARCHIVE_ERRNO_MISC, "bzip decompression failed");
 			return (ARCHIVE_FATAL);
 		}
 	}
@@ -364,25 +372,26 @@
 bzip2_source_close(struct archive_read_source *self)
 {
 	struct private_data *state;
-	int ret;
+	int ret = ARCHIVE_OK;
 
 	state = (struct private_data *)self->data;
-	ret = ARCHIVE_OK;
-	switch (BZ2_bzDecompressEnd(&(state->stream))) {
-	case BZ_OK:
-		break;
-	default:
-		archive_set_error(&(self->archive->archive),
-		    ARCHIVE_ERRNO_MISC,
-		    "Failed to clean up %s compressor",
-		    self->archive->archive.compression_name);
-		ret = ARCHIVE_FATAL;
+
+	if (state->valid) {
+		switch (BZ2_bzDecompressEnd(&state->stream)) {
+		case BZ_OK:
+			break;
+		default:
+			archive_set_error(&self->archive->archive,
+					  ARCHIVE_ERRNO_MISC,
+					  "Failed to clean up decompressor");
+			ret = ARCHIVE_FATAL;
+		}
 	}
 
 	free(state->out_block);
 	free(state);
 	free(self);
-	return (ret);
+	return (ARCHIVE_OK);
 }
 
 #endif /* HAVE_BZLIB_H */

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_compression_compress.c#6 (ktext) ====

@@ -64,7 +64,7 @@
 
 
 #include "archive_platform.h"

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812091621.mB9GLKp1010431>