svn commit: r189424 - head/lib/libarchive

Tim Kientzle kientzle at FreeBSD.org
Thu Mar 5 13:18:12 PST 2009


Author: kientzle
Date: Thu Mar  5 21:18:10 2009
New Revision: 189424
URL: http://svn.freebsd.org/changeset/base/189424

Log:
  Merge r390,r391,r392,r397 from libarchive.googlecode.com:  Virtualize
  "close" and "finish" across both read and write interfaces.
  (Someday, "finish" should be renamed to "free" to better reflect
  what it actually does...)

Modified:
  head/lib/libarchive/archive_private.h
  head/lib/libarchive/archive_read.c
  head/lib/libarchive/archive_virtual.c
  head/lib/libarchive/archive_write.c
  head/lib/libarchive/archive_write_disk.c

Modified: head/lib/libarchive/archive_private.h
==============================================================================
--- head/lib/libarchive/archive_private.h	Thu Mar  5 19:42:11 2009	(r189423)
+++ head/lib/libarchive/archive_private.h	Thu Mar  5 21:18:10 2009	(r189424)
@@ -52,8 +52,8 @@
 #define	ARCHIVE_STATE_FATAL	0x8000U
 
 struct archive_vtable {
-	int	(*archive_write_close)(struct archive *);
-	int	(*archive_write_finish)(struct archive *);
+	int	(*archive_close)(struct archive *);
+	int	(*archive_finish)(struct archive *);
 	int	(*archive_write_header)(struct archive *,
 	    struct archive_entry *);
 	int	(*archive_write_finish_entry)(struct archive *);

Modified: head/lib/libarchive/archive_read.c
==============================================================================
--- head/lib/libarchive/archive_read.c	Thu Mar  5 19:42:11 2009	(r189423)
+++ head/lib/libarchive/archive_read.c	Thu Mar  5 21:18:10 2009	(r189424)
@@ -57,6 +57,22 @@ __FBSDID("$FreeBSD$");
 
 static int	build_stream(struct archive_read *);
 static int	choose_format(struct archive_read *);
+static struct archive_vtable *archive_read_vtable(void);
+static int	_archive_read_close(struct archive *);
+static int	_archive_read_finish(struct archive *);
+
+static struct archive_vtable *
+archive_read_vtable(void)
+{
+	static struct archive_vtable av;
+	static int inited = 0;
+
+	if (!inited) {
+		av.archive_finish = _archive_read_finish;
+		av.archive_close = _archive_read_close;
+	}
+	return (&av);
+}
 
 /*
  * Allocate, initialize and return a struct archive object.
@@ -74,6 +90,7 @@ archive_read_new(void)
 
 	a->archive.state = ARCHIVE_STATE_NEW;
 	a->entry = archive_entry_new();
+	a->archive.vtable = archive_read_vtable();
 
 	return (&a->archive);
 }
@@ -134,6 +151,7 @@ client_close_proxy(struct archive_read_f
 	if (self->archive->client.closer != NULL)
 		r = (self->archive->client.closer)((struct archive *)self->archive,
 		    self->data);
+	self->data = NULL;
 	return (r);
 }
 
@@ -556,8 +574,8 @@ archive_read_data_block(struct archive *
  * Don't assume we actually read anything or performed any non-trivial
  * initialization.
  */
-int
-archive_read_close(struct archive *_a)
+static int
+_archive_read_close(struct archive *_a)
 {
 	struct archive_read *a = (struct archive_read *)_a;
 	int r = ARCHIVE_OK, r1 = ARCHIVE_OK;
@@ -602,13 +620,8 @@ archive_read_close(struct archive *_a)
 /*
  * Release memory and other resources.
  */
-#if ARCHIVE_API_VERSION > 1
 int
-#else
-/* Temporarily allow library to compile with either 1.x or 2.0 API. */
-void
-#endif
-archive_read_finish(struct archive *_a)
+_archive_read_finish(struct archive *_a)
 {
 	struct archive_read *a = (struct archive_read *)_a;
 	int i;

Modified: head/lib/libarchive/archive_virtual.c
==============================================================================
--- head/lib/libarchive/archive_virtual.c	Thu Mar  5 19:42:11 2009	(r189423)
+++ head/lib/libarchive/archive_virtual.c	Thu Mar  5 21:18:10 2009	(r189424)
@@ -33,25 +33,37 @@ __FBSDID("$FreeBSD$");
 int
 archive_write_close(struct archive *a)
 {
-	return ((a->vtable->archive_write_close)(a));
+	return ((a->vtable->archive_close)(a));
+}
+
+int
+archive_read_close(struct archive *a)
+{
+	return ((a->vtable->archive_close)(a));
 }
 
 #if ARCHIVE_API_VERSION > 1
 int
 archive_write_finish(struct archive *a)
 {
-	return ((a->vtable->archive_write_finish)(a));
+	return ((a->vtable->archive_finish)(a));
 }
 #else
 /* Temporarily allow library to compile with either 1.x or 2.0 API. */
 void
 archive_write_finish(struct archive *a)
 {
-	(void)(a->vtable->archive_write_finish)(a);
+	(void)(a->vtable->archive_finish)(a);
 }
 #endif
 
 int
+archive_read_finish(struct archive *a)
+{
+	return ((a->vtable->archive_finish)(a));
+}
+
+int
 archive_write_header(struct archive *a, struct archive_entry *entry)
 {
 	return ((a->vtable->archive_write_header)(a, entry));

Modified: head/lib/libarchive/archive_write.c
==============================================================================
--- head/lib/libarchive/archive_write.c	Thu Mar  5 19:42:11 2009	(r189423)
+++ head/lib/libarchive/archive_write.c	Thu Mar  5 21:18:10 2009	(r189424)
@@ -72,8 +72,8 @@ archive_write_vtable(void)
 	static int inited = 0;
 
 	if (!inited) {
-		av.archive_write_close = _archive_write_close;
-		av.archive_write_finish = _archive_write_finish;
+		av.archive_close = _archive_write_close;
+		av.archive_finish = _archive_write_finish;
 		av.archive_write_header = _archive_write_header;
 		av.archive_write_finish_entry = _archive_write_finish_entry;
 		av.archive_write_data = _archive_write_data;

Modified: head/lib/libarchive/archive_write_disk.c
==============================================================================
--- head/lib/libarchive/archive_write_disk.c	Thu Mar  5 19:42:11 2009	(r189423)
+++ head/lib/libarchive/archive_write_disk.c	Thu Mar  5 21:18:10 2009	(r189424)
@@ -278,8 +278,8 @@ archive_write_disk_vtable(void)
 	static int inited = 0;
 
 	if (!inited) {
-		av.archive_write_close = _archive_write_close;
-		av.archive_write_finish = _archive_write_finish;
+		av.archive_close = _archive_write_close;
+		av.archive_finish = _archive_write_finish;
 		av.archive_write_header = _archive_write_header;
 		av.archive_write_finish_entry = _archive_write_finish_entry;
 		av.archive_write_data = _archive_write_data;


More information about the svn-src-all mailing list