PERFORCE change 140980 for review

Anselm Strauss strauss at FreeBSD.org
Thu May 1 09:56:03 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=140980

Change 140980 by strauss at strauss_marvelman on 2008/05/01 09:55:04

	pull from parent

Affected files ...

.. //depot/projects/soc2008/strauss_libarchive/Makefile.am#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/contrib/README#1 branch
.. //depot/projects/soc2008/strauss_libarchive/contrib/libarchive.1aix53.spec#1 branch
.. //depot/projects/soc2008/strauss_libarchive/contrib/libarchive.spec#1 branch
.. //depot/projects/soc2008/strauss_libarchive/contrib/libarchive_autodetect-st_lib_archive.m4#1 branch
.. //depot/projects/soc2008/strauss_libarchive/contrib/psota-benchmark/results.txt#1 branch
.. //depot/projects/soc2008/strauss_libarchive/contrib/psota-benchmark/tcp.sh#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/Makefile#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/cpio/bsdcpio.1#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_gcpio_compat_ref.bin.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_gcpio_compat_ref.crc.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_gcpio_compat_ref.newc.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_gcpio_compat_ref.ustar.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_f.cpio.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_m.cpio.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_t.cpio.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_t.stdout.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/cpio/test/test_option_tv.stdout.uu#1 branch
.. //depot/projects/soc2008/strauss_libarchive/doc/mdoc2man.awk#1 branch
.. //depot/projects/soc2008/strauss_libarchive/doc/update.sh#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/minitar/Makefile#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/minitar/README#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/minitar/minitar.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/minitar/tree.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/minitar/tree.h#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/tarfilter.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/examples/untar.c#1 branch
.. //depot/projects/soc2008/strauss_libarchive/libarchive/Makefile#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive.h.in#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.3#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.h#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry_link_resolver.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry_private.h#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_platform.h#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_iso9660.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_tar.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_read_support_format_zip.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_string.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_string.h#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_util.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_disk.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_pax.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_ustar.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/cpio.5#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/mtree.5#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/tar.5#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/Makefile#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/main.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_acl_pax.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_archive_api_feature.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_entry.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_pax_filename_encoding.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_tar_filenames.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_tar_large.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/libarchive/test/test_write_format_ar.c#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/Makefile#2 integrate
.. //depot/projects/soc2008/strauss_libarchive/tar/bsdtar.c#2 integrate

Differences ...

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

@@ -317,9 +317,6 @@
 	tar/test/test_stdio.c					\
 	tar/test/test_version.c
 
-bsdtar_test_EXTRA_DIST=						\
-	tar/test/old
-
 bsdtar_test_CPPFLAGS= -I$(top_builddir)/tar/test
 
 tar/test/list.h: Makefile

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

@@ -11,7 +11,9 @@
 SYMLINKS=bsdcpio ${BINDIR}/cpio
 MLINKS= bsdcpio.1 cpio.1
 
-check: $(PROG)
+.PHONY: check test
+
+check test: $(PROG) bsdcpio.1.gz
 	cd ${.CURDIR}/test && make clean test
 
 .include <bsd.prog.mk>

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

@@ -8,12 +8,12 @@
 # Version is three numbers:
 #  Major: Bumped ONLY when API/ABI breakage happens (see SHLIB_MAJOR)
 #  Minor: Bumped when significant new features are added
-#  Revision: Bumped on any notable change
+#  Revision: Bumped frequently.
 
 # The useful version number (one integer, easy to compare)
-LIBARCHIVE_VERSION= 2004012
+LIBARCHIVE_VERSION_NUMBER=2005001
 # The pretty version string
-LIBARCHIVE_VERSION_STRING!= echo $$((${LIBARCHIVE_VERSION} / 1000000)).$$((${LIBARCHIVE_VERSION} / 1000 % 1000)).$$((${LIBARCHIVE_VERSION} % 1000))
+LIBARCHIVE_VERSION_STRING=2.5.1b
 
 # FreeBSD SHLIB_MAJOR value is managed as part of the FreeBSD system.
 # It has no real relation to the version number above.
@@ -31,10 +31,8 @@
 # Note: FreeBSD has inttypes.h, so enable that include in archive.h.in
 archive.h:	archive.h.in Makefile
 	cat ${.CURDIR}/archive.h.in | sed				\
-		-e 's/@LIBARCHIVE_VERSION@/${LIBARCHIVE_VERSION}/g'	\
-		-e 's/@LIBARCHIVE_VERSION_STRING@/${LIBARCHIVE_VERSION_STRING}/g' \
-		-e 's/@SHLIB_MAJOR@/${SHLIB_MAJOR}/g'			\
-		-e 's|@ARCHIVE_H_INCLUDE_INTTYPES_H@|#include <inttypes.h>  /* For int64_t */|g' \
+	   -e 's/@LIBARCHIVE_VERSION_NUMBER@/${LIBARCHIVE_VERSION_NUMBER}/g' \
+	   -e 's/@LIBARCHIVE_VERSION_STRING@/${LIBARCHIVE_VERSION_STRING}/g' \
 		> archive.h
 
 # archive.h needs to be cleaned
@@ -246,7 +244,8 @@
 MLINKS+=	archive_write_disk.3 archive_write_disk_set_user_lookup.3
 MLINKS+=	libarchive.3 archive.3
 
-check:
+.PHONY: check test
+check test:
 	cd ${.CURDIR}/test && make test
 
 .include <bsd.lib.mk>

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive.h.in#2 (text+ko) ====

@@ -29,17 +29,48 @@
 #define	ARCHIVE_H_INCLUDED
 
 #include <sys/types.h>  /* Linux requires this for off_t */
- at ARCHIVE_H_INCLUDE_INTTYPES_H@
+/* TODO: Conditionalize this include on platforms that don't support it. */
+#include <inttypes.h> /* int64_t, etc. */
 #include <stdio.h> /* For FILE * */
-#ifndef _WIN32
-#include <unistd.h>  /* For ssize_t and size_t */
+
+/* Get appropriate definitions of standard POSIX-style types. */
+/* These should match the types used in 'struct stat' */
+#ifdef _WIN32
+#define	__LA_SSIZE_T	long
+#define	__LA_UID_T	unsigned int
+#define	__LA_GID_T	unsigned int
+#else
+#include <unistd.h>  /* ssize_t, uid_t, and gid_t */
+#define	__LA_SSIZE_T	ssize_t
+#define	__LA_UID_T	uid_t
+#define	__LA_GID_T	gid_t
+#endif
+
+/*
+ * On Windows, define LIBARCHIVE_STATIC if you're building or using a
+ * .lib.  The default here assumes you're building a DLL.  Only
+ * libarchive source should ever define __LIBARCHIVE_BUILD.
+ */
+#if ((defined __WIN32__) || (defined _WIN32)) && (!defined LIBARCHIVE_STATIC)
+# ifdef __LIBARCHIVE_BUILD
+#  ifdef __GNUC__
+#   define __LA_DECL	__attribute__((dllexport)) extern
+#  else
+#   define __LA_DECL	__declspec(dllexport)
+#  endif
+# else
+#  ifdef __GNUC__
+#   define __LA_DECL	__attribute__((dllimport)) extern
+#  else
+#   define __LA_DECL	__declspec(dllimport)
+#  endif
+# endif
 #else
-typedef long ssize_t;
-typedef unsigned int uid_t;
-typedef unsigned int gid_t;
-typedef unsigned short mode_t;
+/* Static libraries or non-Windows needs no special declaration. */
+# define __LA_DECL
 #endif
 
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -48,7 +79,9 @@
  * The version number is provided as both a macro and a function.
  * The macro identifies the installed header; the function identifies
  * the library version (which may not be the same if you're using a
- * dynamically-linked version of the library).
+ * dynamically-linked version of the library).  Of course, if the
+ * header and library are very different, you should expect some
+ * strangeness.  Don't do that.
  */
 
 /*
@@ -69,13 +102,14 @@
  *             (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
  * #endif
  */
-#define ARCHIVE_VERSION_NUMBER		@LIBARCHIVE_VERSION@
-int		archive_version_number(void);
+#define ARCHIVE_VERSION_NUMBER		@LIBARCHIVE_VERSION_NUMBER@
+__LA_DECL int		archive_version_number(void);
 
 /*
  * Textual name/version of the library, useful for version displays.
  */
-const char *	archive_version_string(void);
+#define	ARCHIVE_VERSION_STRING	"libarchive @LIBARCHIVE_VERSION_STRING@"
+__LA_DECL const char *	archive_version_string(void);
 
 #if ARCHIVE_VERSION_NUMBER < 3000000
 /*
@@ -83,13 +117,13 @@
  * the simpler definitions above.
  */
 #define	ARCHIVE_VERSION_STAMP	ARCHIVE_VERSION_NUMBER
-int		archive_version_stamp(void);
-#define	ARCHIVE_LIBRARY_VERSION	"libarchive @LIBARCHIVE_VERSION_STRING@"
-const char *	archive_version(void);
+__LA_DECL int		archive_version_stamp(void);
+#define	ARCHIVE_LIBRARY_VERSION	ARCHIVE_VERSION_STRING
+__LA_DECL const char *	archive_version(void);
 #define	ARCHIVE_API_VERSION	(ARCHIVE_VERSION_NUMBER / 1000000)
-int		archive_api_version(void);
+__LA_DECL int		archive_api_version(void);
 #define	ARCHIVE_API_FEATURE	((ARCHIVE_VERSION_NUMBER / 1000) % 1000)
-int		archive_api_feature(void);
+__LA_DECL int		archive_api_feature(void);
 #endif
 
 #if ARCHIVE_VERSION_NUMBER < 3000000
@@ -139,18 +173,18 @@
  */
 
 /* Returns pointer and size of next block of data from archive. */
-typedef ssize_t	archive_read_callback(struct archive *, void *_client_data,
+typedef __LA_SSIZE_T	archive_read_callback(struct archive *, void *_client_data,
 		    const void **_buffer);
 /* Skips at most request bytes from archive and returns the skipped amount */
 #if ARCHIVE_VERSION_NUMBER < 2000000
-typedef ssize_t	archive_skip_callback(struct archive *, void *_client_data,
+typedef __LA_SSIZE_T	archive_skip_callback(struct archive *, void *_client_data,
 		    size_t request);
 #else
 typedef off_t	archive_skip_callback(struct archive *, void *_client_data,
 		    off_t request);
 #endif
 /* Returns size actually written, zero on EOF, -1 on error. */
-typedef ssize_t	archive_write_callback(struct archive *, void *_client_data,
+typedef __LA_SSIZE_T	archive_write_callback(struct archive *, void *_client_data,
 		    const void *_buffer, size_t _length);
 typedef int	archive_open_callback(struct archive *, void *_client_data);
 typedef int	archive_close_callback(struct archive *, void *_client_data);
@@ -218,7 +252,7 @@
  *      data for entries of interest.
  *   5) Call archive_read_finish to end processing.
  */
-struct archive	*archive_read_new(void);
+__LA_DECL struct archive	*archive_read_new(void);
 
 /*
  * The archive_read_support_XXX calls enable auto-detect for this
@@ -227,30 +261,30 @@
  * support_compression_bzip2().  The "all" functions provide the
  * obvious shorthand.
  */
-int		 archive_read_support_compression_all(struct archive *);
-int		 archive_read_support_compression_bzip2(struct archive *);
-int		 archive_read_support_compression_compress(struct archive *);
-int		 archive_read_support_compression_gzip(struct archive *);
-int		 archive_read_support_compression_none(struct archive *);
-int		 archive_read_support_compression_program(struct archive *,
+__LA_DECL int		 archive_read_support_compression_all(struct archive *);
+__LA_DECL int		 archive_read_support_compression_bzip2(struct archive *);
+__LA_DECL int		 archive_read_support_compression_compress(struct archive *);
+__LA_DECL int		 archive_read_support_compression_gzip(struct archive *);
+__LA_DECL int		 archive_read_support_compression_none(struct archive *);
+__LA_DECL int		 archive_read_support_compression_program(struct archive *,
 		     const char *command);
 
-int		 archive_read_support_format_all(struct archive *);
-int		 archive_read_support_format_ar(struct archive *);
-int		 archive_read_support_format_cpio(struct archive *);
-int		 archive_read_support_format_empty(struct archive *);
-int		 archive_read_support_format_gnutar(struct archive *);
-int		 archive_read_support_format_iso9660(struct archive *);
-int		 archive_read_support_format_mtree(struct archive *);
-int		 archive_read_support_format_tar(struct archive *);
-int		 archive_read_support_format_zip(struct archive *);
+__LA_DECL int		 archive_read_support_format_all(struct archive *);
+__LA_DECL int		 archive_read_support_format_ar(struct archive *);
+__LA_DECL int		 archive_read_support_format_cpio(struct archive *);
+__LA_DECL int		 archive_read_support_format_empty(struct archive *);
+__LA_DECL int		 archive_read_support_format_gnutar(struct archive *);
+__LA_DECL int		 archive_read_support_format_iso9660(struct archive *);
+__LA_DECL int		 archive_read_support_format_mtree(struct archive *);
+__LA_DECL int		 archive_read_support_format_tar(struct archive *);
+__LA_DECL int		 archive_read_support_format_zip(struct archive *);
 
 
 /* Open the archive using callbacks for archive I/O. */
-int		 archive_read_open(struct archive *, void *_client_data,
+__LA_DECL int		 archive_read_open(struct archive *, void *_client_data,
 		     archive_open_callback *, archive_read_callback *,
 		     archive_close_callback *);
-int		 archive_read_open2(struct archive *, void *_client_data,
+__LA_DECL int		 archive_read_open2(struct archive *, void *_client_data,
 		     archive_open_callback *, archive_read_callback *,
 		     archive_skip_callback *, archive_close_callback *);
 
@@ -260,43 +294,43 @@
  * accept a block size handle tape blocking correctly.
  */
 /* Use this if you know the filename.  Note: NULL indicates stdin. */
-int		 archive_read_open_filename(struct archive *,
+__LA_DECL int		 archive_read_open_filename(struct archive *,
 		     const char *_filename, size_t _block_size);
 /* archive_read_open_file() is a deprecated synonym for ..._open_filename(). */
-int		 archive_read_open_file(struct archive *,
+__LA_DECL int		 archive_read_open_file(struct archive *,
 		     const char *_filename, size_t _block_size);
 /* Read an archive that's stored in memory. */
-int		 archive_read_open_memory(struct archive *,
+__LA_DECL int		 archive_read_open_memory(struct archive *,
 		     void * buff, size_t size);
 /* A more involved version that is only used for internal testing. */
-int		archive_read_open_memory2(struct archive *a, void *buff,
+__LA_DECL int		archive_read_open_memory2(struct archive *a, void *buff,
 		     size_t size, size_t read_size);
 /* Read an archive that's already open, using the file descriptor. */
-int		 archive_read_open_fd(struct archive *, int _fd,
+__LA_DECL int		 archive_read_open_fd(struct archive *, int _fd,
 		     size_t _block_size);
 /* Read an archive that's already open, using a FILE *. */
 /* Note: DO NOT use this with tape drives. */
-int		 archive_read_open_FILE(struct archive *, FILE *_file);
+__LA_DECL int		 archive_read_open_FILE(struct archive *, FILE *_file);
 
 /* Parses and returns next entry header. */
-int		 archive_read_next_header(struct archive *,
+__LA_DECL int		 archive_read_next_header(struct archive *,
 		     struct archive_entry **);
 
 /*
  * Retrieve the byte offset in UNCOMPRESSED data where last-read
  * header started.
  */
-int64_t		 archive_read_header_position(struct archive *);
+__LA_DECL int64_t		 archive_read_header_position(struct archive *);
 
 /* Read data from the body of an entry.  Similar to read(2). */
-ssize_t		 archive_read_data(struct archive *, void *, size_t);
+__LA_DECL __LA_SSIZE_T		 archive_read_data(struct archive *, void *, size_t);
 /*
  * A zero-copy version of archive_read_data that also exposes the file offset
  * of each returned block.  Note that the client has no way to specify
  * the desired size of the block.  The API does guarantee that offsets will
  * be strictly increasing and that returned blocks will not overlap.
  */
-int		 archive_read_data_block(struct archive *a,
+__LA_DECL int		 archive_read_data_block(struct archive *a,
 		    const void **buff, size_t *size, off_t *offset);
 
 /*-
@@ -305,10 +339,10 @@
  *  'into_buffer': writes data into memory buffer that you provide
  *  'into_fd': writes data to specified filedes
  */
-int		 archive_read_data_skip(struct archive *);
-int		 archive_read_data_into_buffer(struct archive *, void *buffer,
-		     ssize_t len);
-int		 archive_read_data_into_fd(struct archive *, int fd);
+__LA_DECL int		 archive_read_data_skip(struct archive *);
+__LA_DECL int		 archive_read_data_into_buffer(struct archive *, void *buffer,
+		     __LA_SSIZE_T len);
+__LA_DECL int		 archive_read_data_into_fd(struct archive *, int fd);
 
 /*-
  * Convenience function to recreate the current entry (whose header
@@ -352,26 +386,26 @@
 /* Default: Overwrite files, even if one on disk is newer. */
 #define	ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER (2048)
 
-int		 archive_read_extract(struct archive *, struct archive_entry *,
+__LA_DECL int		 archive_read_extract(struct archive *, struct archive_entry *,
 		     int flags);
-void		 archive_read_extract_set_progress_callback(struct archive *,
+__LA_DECL void		 archive_read_extract_set_progress_callback(struct archive *,
 		     void (*_progress_func)(void *), void *_user_data);
 
 /* Record the dev/ino of a file that will not be written.  This is
  * generally set to the dev/ino of the archive being read. */
-void		archive_read_extract_set_skip_file(struct archive *,
+__LA_DECL void		archive_read_extract_set_skip_file(struct archive *,
 		     dev_t, ino_t);
 
 /* Close the file and release most resources. */
-int		 archive_read_close(struct archive *);
+__LA_DECL int		 archive_read_close(struct archive *);
 /* Release all resources and destroy the object. */
 /* Note that archive_read_finish will call archive_read_close for you. */
 #if ARCHIVE_VERSION_NUMBER >= 2000000
-int		 archive_read_finish(struct archive *);
+__LA_DECL int		 archive_read_finish(struct archive *);
 #else
 /* Temporarily allow library to compile with either 1.x or 2.0 API. */
 /* Erroneously declared to return void in libarchive 1.x */
-void		 archive_read_finish(struct archive *);
+__LA_DECL void		 archive_read_finish(struct archive *);
 #endif
 
 /*-
@@ -389,75 +423,75 @@
  *   5) archive_write_close to close the output
  *   6) archive_write_finish to cleanup the writer and release resources
  */
-struct archive	*archive_write_new(void);
-int		 archive_write_set_bytes_per_block(struct archive *,
+__LA_DECL struct archive	*archive_write_new(void);
+__LA_DECL int		 archive_write_set_bytes_per_block(struct archive *,
 		     int bytes_per_block);
-int		 archive_write_get_bytes_per_block(struct archive *);
+__LA_DECL int		 archive_write_get_bytes_per_block(struct archive *);
 /* XXX This is badly misnamed; suggestions appreciated. XXX */
-int		 archive_write_set_bytes_in_last_block(struct archive *,
+__LA_DECL int		 archive_write_set_bytes_in_last_block(struct archive *,
 		     int bytes_in_last_block);
-int		 archive_write_get_bytes_in_last_block(struct archive *);
+__LA_DECL int		 archive_write_get_bytes_in_last_block(struct archive *);
 
 /* The dev/ino of a file that won't be archived.  This is used
  * to avoid recursively adding an archive to itself. */
-int		 archive_write_set_skip_file(struct archive *, dev_t, ino_t);
+__LA_DECL int		 archive_write_set_skip_file(struct archive *, dev_t, ino_t);
 
-int		 archive_write_set_compression_bzip2(struct archive *);
-int		 archive_write_set_compression_compress(struct archive *);
-int		 archive_write_set_compression_gzip(struct archive *);
-int		 archive_write_set_compression_none(struct archive *);
-int		 archive_write_set_compression_program(struct archive *,
+__LA_DECL int		 archive_write_set_compression_bzip2(struct archive *);
+__LA_DECL int		 archive_write_set_compression_compress(struct archive *);
+__LA_DECL int		 archive_write_set_compression_gzip(struct archive *);
+__LA_DECL int		 archive_write_set_compression_none(struct archive *);
+__LA_DECL int		 archive_write_set_compression_program(struct archive *,
 		     const char *cmd);
 /* A convenience function to set the format based on the code or name. */
-int		 archive_write_set_format(struct archive *, int format_code);
-int		 archive_write_set_format_by_name(struct archive *,
+__LA_DECL int		 archive_write_set_format(struct archive *, int format_code);
+__LA_DECL int		 archive_write_set_format_by_name(struct archive *,
 		     const char *name);
 /* To minimize link pollution, use one or more of the following. */
-int		 archive_write_set_format_ar_bsd(struct archive *);
-int		 archive_write_set_format_ar_svr4(struct archive *);
-int		 archive_write_set_format_cpio(struct archive *);
-int		 archive_write_set_format_cpio_newc(struct archive *);
+__LA_DECL int		 archive_write_set_format_ar_bsd(struct archive *);
+__LA_DECL int		 archive_write_set_format_ar_svr4(struct archive *);
+__LA_DECL int		 archive_write_set_format_cpio(struct archive *);
+__LA_DECL int		 archive_write_set_format_cpio_newc(struct archive *);
 /* TODO: int archive_write_set_format_old_tar(struct archive *); */
-int		 archive_write_set_format_pax(struct archive *);
-int		 archive_write_set_format_pax_restricted(struct archive *);
-int		 archive_write_set_format_shar(struct archive *);
-int		 archive_write_set_format_shar_dump(struct archive *);
-int		 archive_write_set_format_ustar(struct archive *);
-int		 archive_write_open(struct archive *, void *,
+__LA_DECL int		 archive_write_set_format_pax(struct archive *);
+__LA_DECL int		 archive_write_set_format_pax_restricted(struct archive *);
+__LA_DECL int		 archive_write_set_format_shar(struct archive *);
+__LA_DECL int		 archive_write_set_format_shar_dump(struct archive *);
+__LA_DECL int		 archive_write_set_format_ustar(struct archive *);
+__LA_DECL int		 archive_write_open(struct archive *, void *,
 		     archive_open_callback *, archive_write_callback *,
 		     archive_close_callback *);
-int		 archive_write_open_fd(struct archive *, int _fd);
-int		 archive_write_open_filename(struct archive *, const char *_file);
+__LA_DECL int		 archive_write_open_fd(struct archive *, int _fd);
+__LA_DECL int		 archive_write_open_filename(struct archive *, const char *_file);
 /* A deprecated synonym for archive_write_open_filename() */
-int		 archive_write_open_file(struct archive *, const char *_file);
-int		 archive_write_open_FILE(struct archive *, FILE *);
+__LA_DECL int		 archive_write_open_file(struct archive *, const char *_file);
+__LA_DECL int		 archive_write_open_FILE(struct archive *, FILE *);
 /* _buffSize is the size of the buffer, _used refers to a variable that
  * will be updated after each write into the buffer. */
-int		 archive_write_open_memory(struct archive *,
+__LA_DECL int		 archive_write_open_memory(struct archive *,
 			void *_buffer, size_t _buffSize, size_t *_used);
 
 /*
  * Note that the library will truncate writes beyond the size provided
  * to archive_write_header or pad if the provided data is short.
  */
-int		 archive_write_header(struct archive *,
+__LA_DECL int		 archive_write_header(struct archive *,
 		     struct archive_entry *);
 #if ARCHIVE_VERSION_NUMBER >= 2000000
-ssize_t		 archive_write_data(struct archive *, const void *, size_t);
+__LA_DECL __LA_SSIZE_T		 archive_write_data(struct archive *, const void *, size_t);
 #else
 /* Temporarily allow library to compile with either 1.x or 2.0 API. */
 /* This was erroneously declared to return "int" in libarchive 1.x. */
-int		 archive_write_data(struct archive *, const void *, size_t);
+__LA_DECL int		 archive_write_data(struct archive *, const void *, size_t);
 #endif
-ssize_t		 archive_write_data_block(struct archive *, const void *, size_t, off_t);
-int		 archive_write_finish_entry(struct archive *);
-int		 archive_write_close(struct archive *);
+__LA_DECL __LA_SSIZE_T		 archive_write_data_block(struct archive *, const void *, size_t, off_t);
+__LA_DECL int		 archive_write_finish_entry(struct archive *);
+__LA_DECL int		 archive_write_close(struct archive *);
 #if ARCHIVE_VERSION_NUMBER >= 2000000
-int		 archive_write_finish(struct archive *);
+__LA_DECL int		 archive_write_finish(struct archive *);
 #else
 /* Temporarily allow library to compile with either 1.x or 2.0 API. */
 /* Return value was incorrect in libarchive 1.x. */
-void		 archive_write_finish(struct archive *);
+__LA_DECL void		 archive_write_finish(struct archive *);
 #endif
 
 /*-
@@ -474,12 +508,12 @@
  * In particular, you can use this in conjunction with archive_read()
  * to pull entries out of an archive and create them on disk.
  */
-struct archive	*archive_write_disk_new(void);
+__LA_DECL struct archive	*archive_write_disk_new(void);
 /* This file will not be overwritten. */
-int		 archive_write_disk_set_skip_file(struct archive *,
+__LA_DECL int		 archive_write_disk_set_skip_file(struct archive *,
 		     dev_t, ino_t);
 /* Set flags to control how the next item gets created. */
-int		 archive_write_disk_set_options(struct archive *,
+__LA_DECL int		 archive_write_disk_set_options(struct archive *,
 		     int flags);
 /*
  * The lookup functions are given uname/uid (or gname/gid) pairs and
@@ -498,42 +532,47 @@
  * particular, these match the specifications of POSIX "pax" and old
  * POSIX "tar".
  */
-int		 archive_write_disk_set_standard_lookup(struct archive *);
+__LA_DECL int	 archive_write_disk_set_standard_lookup(struct archive *);
 /*
  * If neither the default (naive) nor the standard (big) functions suit
  * your needs, you can write your own and register them.  Be sure to
  * include a cleanup function if you have allocated private data.
  */
-int		 archive_write_disk_set_group_lookup(struct archive *,
-		     void *private_data,
-		     gid_t (*loookup)(void *, const char *gname, gid_t gid),
-		     void (*cleanup)(void *));
-int		 archive_write_disk_set_user_lookup(struct archive *,
-		     void *private_data,
-		     uid_t (*)(void *, const char *uname, uid_t uid),
-		     void (*cleanup)(void *));
+__LA_DECL int	 archive_write_disk_set_group_lookup(struct archive *,
+			    void * /* private_data */,
+			    __LA_GID_T (*)(void *, const char *, __LA_GID_T),
+			    void (* /* cleanup */)(void *));
+__LA_DECL int	 archive_write_disk_set_user_lookup(struct archive *,
+			    void * /* private_data */,
+			    __LA_UID_T (*)(void *, const char *, __LA_UID_T),
+			    void (* /* cleanup */)(void *));
 
 /*
  * Accessor functions to read/set various information in
  * the struct archive object:
  */
 /* Bytes written after compression or read before decompression. */
-int64_t		 archive_position_compressed(struct archive *);
+__LA_DECL int64_t	 archive_position_compressed(struct archive *);
 /* Bytes written to compressor or read from decompressor. */
-int64_t		 archive_position_uncompressed(struct archive *);
+__LA_DECL int64_t	 archive_position_uncompressed(struct archive *);
 
-const char	*archive_compression_name(struct archive *);
-int		 archive_compression(struct archive *);
-int		 archive_errno(struct archive *);
-const char	*archive_error_string(struct archive *);
-const char	*archive_format_name(struct archive *);
-int		 archive_format(struct archive *);
-void		 archive_clear_error(struct archive *);
-void		 archive_set_error(struct archive *, int _err, const char *fmt, ...);
-void		 archive_copy_error(struct archive *dest, struct archive *src);
+__LA_DECL const char	*archive_compression_name(struct archive *);
+__LA_DECL int		 archive_compression(struct archive *);
+__LA_DECL int		 archive_errno(struct archive *);
+__LA_DECL const char	*archive_error_string(struct archive *);
+__LA_DECL const char	*archive_format_name(struct archive *);
+__LA_DECL int		 archive_format(struct archive *);
+__LA_DECL void		 archive_clear_error(struct archive *);
+__LA_DECL void		 archive_set_error(struct archive *, int _err,
+			    const char *fmt, ...);
+__LA_DECL void		 archive_copy_error(struct archive *dest,
+			    struct archive *src);
 
 #ifdef __cplusplus
 }
 #endif
 
+/* This is meaningless outside of this header. */
+#undef __LA_DECL
+
 #endif /* !ARCHIVE_H_INCLUDED */

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.3#2 (text+ko) ====

@@ -48,6 +48,7 @@
 .Nm archive_entry_copy_link ,
 .Nm archive_entry_copy_link_w ,
 .Nm archive_entry_copy_pathname_w ,
+.Nm archive_entry_copy_sourcepath ,
 .Nm archive_entry_copy_stat ,
 .Nm archive_entry_copy_symlink ,
 .Nm archive_entry_copy_symlink_w ,
@@ -95,6 +96,7 @@
 .Nm archive_entry_set_uid ,
 .Nm archive_entry_set_uname ,
 .Nm archive_entry_size ,
+.Nm archive_entry_sourcepath ,
 .Nm archive_entry_stat ,
 .Nm archive_entry_symlink ,
 .Nm archive_entry_uid ,
@@ -167,6 +169,8 @@
 .Ft void
 .Fn archive_entry_copy_hardlink_w "struct archive_entry *" "const wchar_t *"
 .Ft void
+.Fn archive_entry_copy_sourcepath "struct archive_entry *" "const char *"
+.Ft void
 .Fn archive_entry_copy_pathname_w "struct archive_entry *" "const wchar_t *"
 .Ft void
 .Fn archive_entry_copy_stat "struct archive_entry *" "const struct stat *"
@@ -270,6 +274,8 @@
 .Fn archive_entry_set_uname "struct archive_entry *" "const char *"
 .Ft int64_t
 .Fn archive_entry_size "struct archive_entry *"
+.Ft const char *
+.Fn archive_entry_sourcepath "struct archive_entry *"
 .Ft const struct stat *
 .Fn archive_entry_stat "struct archive_entry *"
 .Ft const char *

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_entry.c#2 (text+ko) ====

@@ -91,15 +91,17 @@
 static void	aes_copy(struct aes *dest, struct aes *src);
 static const char *	aes_get_mbs(struct aes *);
 static const wchar_t *	aes_get_wcs(struct aes *);
-static void	aes_set_mbs(struct aes *, const char *mbs);
-static void	aes_copy_mbs(struct aes *, const char *mbs);
+static int	aes_set_mbs(struct aes *, const char *mbs);
+static int	aes_copy_mbs(struct aes *, const char *mbs);
 /* static void	aes_set_wcs(struct aes *, const wchar_t *wcs); */
-static void	aes_copy_wcs(struct aes *, const wchar_t *wcs);
-static void	aes_copy_wcs_len(struct aes *, const wchar_t *wcs, size_t);
+static int	aes_copy_wcs(struct aes *, const wchar_t *wcs);
+static int	aes_copy_wcs_len(struct aes *, const wchar_t *wcs, size_t);
 
 static char *	 ae_fflagstostr(unsigned long bitset, unsigned long bitclear);
 static const wchar_t	*ae_wcstofflags(const wchar_t *stringp,
 		    unsigned long *setp, unsigned long *clrp);
+static const char	*ae_strtofflags(const char *stringp,
+		    unsigned long *setp, unsigned long *clrp);
 static void	append_entry_w(wchar_t **wp, const wchar_t *prefix, int tag,
 		    const wchar_t *wname, int perm, int id);
 static void	append_id_w(wchar_t **wp, int id);
@@ -144,173 +146,216 @@
 #define wmemcpy(a,b,i)  (wchar_t *)memcpy((a), (b), (i) * sizeof(wchar_t))
 #endif
 
-
 static void
 aes_clean(struct aes *aes)
 {
-	if (aes->aes_mbs_alloc) {
-		free(aes->aes_mbs_alloc);
-		aes->aes_mbs_alloc = NULL;
+	if (aes->aes_wcs) {
+		free((wchar_t *)(uintptr_t)aes->aes_wcs);
+		aes->aes_wcs = NULL;
 	}
-	if (aes->aes_wcs_alloc) {
-		free(aes->aes_wcs_alloc);
-		aes->aes_wcs_alloc = NULL;
-	}
-	memset(aes, 0, sizeof(*aes));
+	archive_string_free(&(aes->aes_mbs));
+	archive_string_free(&(aes->aes_utf8));
+	aes->aes_set = 0;
 }
 
 static void
 aes_copy(struct aes *dest, struct aes *src)
 {
-	*dest = *src;
-	if (src->aes_mbs != NULL) {
-		dest->aes_mbs_alloc = strdup(src->aes_mbs);
-		dest->aes_mbs = dest->aes_mbs_alloc;
-		if (dest->aes_mbs == NULL)
-			__archive_errx(1, "No memory for aes_copy()");
-	}
+	wchar_t *wp;
+
+	dest->aes_set = src->aes_set;
+	archive_string_copy(&(dest->aes_mbs), &(src->aes_mbs));
+	archive_string_copy(&(dest->aes_utf8), &(src->aes_utf8));
 
 	if (src->aes_wcs != NULL) {
-		dest->aes_wcs_alloc = (wchar_t *)malloc((wcslen(src->aes_wcs) + 1)
+		wp = (wchar_t *)malloc((wcslen(src->aes_wcs) + 1)
 		    * sizeof(wchar_t));
-		dest->aes_wcs = dest->aes_wcs_alloc;
-		if (dest->aes_wcs == NULL)
+		if (wp == NULL)
 			__archive_errx(1, "No memory for aes_copy()");
-		wcscpy(dest->aes_wcs_alloc, src->aes_wcs);
+		wcscpy(wp, src->aes_wcs);
+		dest->aes_wcs = wp;
+	}
+}
+
+static const char *
+aes_get_utf8(struct aes *aes)
+{
+	if (aes->aes_set & AES_SET_UTF8)
+		return (aes->aes_utf8.s);
+	if ((aes->aes_set & AES_SET_WCS)
+	    && archive_strappend_w_utf8(&(aes->aes_utf8), aes->aes_wcs) != NULL) {
+		aes->aes_set |= AES_SET_UTF8;
+		return (aes->aes_utf8.s);
 	}
+	return (NULL);
 }
 
 static const char *
 aes_get_mbs(struct aes *aes)
 {
-	if (aes->aes_mbs == NULL && aes->aes_wcs == NULL)
-		return NULL;
-	if (aes->aes_mbs == NULL && aes->aes_wcs != NULL) {
-		/*
-		 * XXX Need to estimate the number of byte in the
-		 * multi-byte form.  Assume that, on average, wcs
-		 * chars encode to no more than 3 bytes.  There must
-		 * be a better way... XXX
-		 */
-		size_t mbs_length = wcslen(aes->aes_wcs) * 3 + 64;
-
-		aes->aes_mbs_alloc = (char *)malloc(mbs_length);
-		aes->aes_mbs = aes->aes_mbs_alloc;
-		if (aes->aes_mbs == NULL)
-			__archive_errx(1, "No memory for aes_get_mbs()");
-		wcstombs(aes->aes_mbs_alloc, aes->aes_wcs, mbs_length - 1);
-		aes->aes_mbs_alloc[mbs_length - 1] = 0;
+	/* If we already have an MBS form, return that immediately. */
+	if (aes->aes_set & AES_SET_MBS)
+		return (aes->aes_mbs.s);
+	/* If there's a WCS form, try converting with the native locale. */
+	if ((aes->aes_set & AES_SET_WCS)
+	    && archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) != NULL) {
+		aes->aes_set |= AES_SET_MBS;
+		return (aes->aes_mbs.s);
 	}
-	return (aes->aes_mbs);
+	/* We'll use UTF-8 for MBS if all else fails. */
+	return (aes_get_utf8(aes));
 }
 
 static const wchar_t *
 aes_get_wcs(struct aes *aes)
 {
+	wchar_t *w;
 	int r;
 
-	if (aes->aes_wcs == NULL && aes->aes_mbs == NULL)
-		return NULL;
-	if (aes->aes_wcs == NULL && aes->aes_mbs != NULL) {
+	/* Return WCS form if we already have it. */
+	if (aes->aes_set & AES_SET_WCS)
+		return (aes->aes_wcs);
+
+	if (aes->aes_set & AES_SET_MBS) {
+		/* Try converting MBS to WCS using native locale. */
 		/*
 		 * No single byte will be more than one wide character,
 		 * so this length estimate will always be big enough.
 		 */
-		size_t wcs_length = strlen(aes->aes_mbs);
+		size_t wcs_length = aes->aes_mbs.length;
 
-		aes->aes_wcs_alloc
-		    = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t));
-		aes->aes_wcs = aes->aes_wcs_alloc;
-		if (aes->aes_wcs == NULL)
+		w = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t));
+		if (w == NULL)
 			__archive_errx(1, "No memory for aes_get_wcs()");
-		r = mbstowcs(aes->aes_wcs_alloc, aes->aes_mbs, wcs_length);
-		aes->aes_wcs_alloc[wcs_length] = 0;
-		if (r == -1) {
-			/* Conversion failed, don't lie to our clients. */
-			free(aes->aes_wcs_alloc);
-			aes->aes_wcs = aes->aes_wcs_alloc = NULL;
+		r = mbstowcs(w, aes->aes_mbs.s, wcs_length);
+		w[wcs_length] = 0;
+		if (r > 0) {
+			aes->aes_set |= AES_SET_WCS;
+			return (aes->aes_wcs = w);
 		}
+		free(w);
 	}
-	return (aes->aes_wcs);
+
+	if (aes->aes_set & AES_SET_UTF8) {
+		/* Try converting UTF8 to WCS. */
+		aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8));
+		aes->aes_set |= AES_SET_WCS;
+		return (aes->aes_wcs);
+	}
+	return (NULL);
 }
 
-static void
+static int
 aes_set_mbs(struct aes *aes, const char *mbs)
 {
-	if (aes->aes_mbs_alloc) {
-		free(aes->aes_mbs_alloc);
-		aes->aes_mbs_alloc = NULL;
-	}
-	if (aes->aes_wcs_alloc) {
-		free(aes->aes_wcs_alloc);
-		aes->aes_wcs_alloc = NULL;
-	}
-	aes->aes_mbs = mbs;
-	aes->aes_wcs = NULL;
+	return (aes_copy_mbs(aes, mbs));
 }
 
-static void
+static int
 aes_copy_mbs(struct aes *aes, const char *mbs)
 {
-	if (aes->aes_mbs_alloc) {
-		free(aes->aes_mbs_alloc);
-		aes->aes_mbs_alloc = NULL;
+	if (mbs == NULL) {
+		aes->aes_set = 0;
+		return (0);
 	}
-	if (aes->aes_wcs_alloc) {
-		free(aes->aes_wcs_alloc);
-		aes->aes_wcs_alloc = NULL;
+	aes->aes_set = AES_SET_MBS; /* Only MBS form is set now. */
+	archive_strcpy(&(aes->aes_mbs), mbs);
+	archive_string_empty(&(aes->aes_utf8));
+	if (aes->aes_wcs) {
+		free((wchar_t *)(uintptr_t)aes->aes_wcs);
+		aes->aes_wcs = NULL;
 	}
-	aes->aes_mbs_alloc = (char *)malloc((strlen(mbs) + 1) * sizeof(char));
-	if (aes->aes_mbs_alloc == NULL)
-		__archive_errx(1, "No memory for aes_copy_mbs()");
-	strcpy(aes->aes_mbs_alloc, mbs);
-	aes->aes_mbs = aes->aes_mbs_alloc;
-	aes->aes_wcs = NULL;
+	return (0);
 }
 
-#if 0
-static void
-aes_set_wcs(struct aes *aes, const wchar_t *wcs)
+/*
+ * The 'update' form tries to proactively update all forms of
+ * this string (WCS and MBS) and returns an error if any of
+ * them fail.  This is used by the 'pax' handler, for instance,
+ * to detect and report character-conversion failures early while
+ * still allowing clients to get potentially useful values from
+ * the more tolerant lazy conversions.  (get_mbs and get_wcs will
+ * strive to give the user something useful, so you can get hopefully
+ * usable values even if some of the character conversions are failing.)
+ */
+static int
+aes_update_utf8(struct aes *aes, const char *utf8)
 {
-	if (aes->aes_mbs_alloc) {
-		free(aes->aes_mbs_alloc);
-		aes->aes_mbs_alloc = NULL;
+	if (utf8 == NULL) {
+		aes->aes_set = 0;
+		return (1); /* Succeeded in clearing everything. */
 	}
-	if (aes->aes_wcs_alloc) {
-		free(aes->aes_wcs_alloc);
-		aes->aes_wcs_alloc = NULL;
+
+	/* Save the UTF8 string. */
+	archive_strcpy(&(aes->aes_utf8), utf8);
+
+	/* Empty the mbs and wcs strings. */
+	archive_string_empty(&(aes->aes_mbs));
+	if (aes->aes_wcs) {
+		free((wchar_t *)(uintptr_t)aes->aes_wcs);
+		aes->aes_wcs = NULL;
 	}
-	aes->aes_mbs = NULL;
-	aes->aes_wcs = wcs;
+
+	aes->aes_set = AES_SET_UTF8;	/* Only UTF8 is set now. */
+
+	/* TODO: We should just do a direct UTF-8 to MBS conversion
+	 * here.  That would be faster, use less space, and give the
+	 * same information.  (If a UTF-8 to MBS conversion succeeds,
+	 * then UTF-8->WCS and Unicode->MBS conversions will both
+	 * succeed.) */
+
+	/* Try converting UTF8 to WCS, return false on failure. */
+	aes->aes_wcs = __archive_string_utf8_w(&(aes->aes_utf8));
+	if (aes->aes_wcs == NULL)
+		return (0);
+	aes->aes_set = AES_SET_UTF8 | AES_SET_WCS; /* Both UTF8 and WCS set. */
+
+	/* Try converting WCS to MBS, return false on failure. */
+	if (archive_strappend_w_mbs(&(aes->aes_mbs), aes->aes_wcs) == NULL)
+		return (0);
+	aes->aes_set = AES_SET_UTF8 | AES_SET_WCS | AES_SET_MBS;
+
+	/* All conversions succeeded. */
+	return (1);
 }
-#endif
 
-static void
+static int
 aes_copy_wcs(struct aes *aes, const wchar_t *wcs)
 {
-	aes_copy_wcs_len(aes, wcs, wcslen(wcs));
+	return aes_copy_wcs_len(aes, wcs, wcs == NULL ? 0 : wcslen(wcs));
 }
 
-static void
+static int
 aes_copy_wcs_len(struct aes *aes, const wchar_t *wcs, size_t len)
 {
-	if (aes->aes_mbs_alloc) {
-		free(aes->aes_mbs_alloc);
-		aes->aes_mbs_alloc = NULL;
+	wchar_t *w;
+
+	if (wcs == NULL) {
+		aes->aes_set = 0;
+		return (0);
 	}
-	if (aes->aes_wcs_alloc) {
-		free(aes->aes_wcs_alloc);
-		aes->aes_wcs_alloc = NULL;
+	aes->aes_set = AES_SET_WCS; /* Only WCS form set. */
+	archive_string_empty(&(aes->aes_mbs));
+	archive_string_empty(&(aes->aes_utf8));
+	if (aes->aes_wcs) {
+		free((wchar_t *)(uintptr_t)aes->aes_wcs);
+		aes->aes_wcs = NULL;
 	}
-	aes->aes_mbs = NULL;
-	aes->aes_wcs_alloc = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
-	if (aes->aes_wcs_alloc == NULL)
+	w = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
+	if (w == NULL)
 		__archive_errx(1, "No memory for aes_copy_wcs()");
-	wmemcpy(aes->aes_wcs_alloc, wcs, len);
-	aes->aes_wcs_alloc[len] = L'\0';
-	aes->aes_wcs = aes->aes_wcs_alloc;
+	wmemcpy(w, wcs, len);
+	w[len] = L'\0';
+	aes->aes_wcs = w;
+	return (0);
 }
 
+/****************************************************************************
+ *
+ * Public Interface
+ *
+ ****************************************************************************/
+
 struct archive_entry *

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


More information about the p4-projects mailing list