summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-03-05 21:18:10 +0000
committerkientzle <kientzle@FreeBSD.org>2009-03-05 21:18:10 +0000
commitbc77a8346240746144dcde0fd516c9c5bc18c02e (patch)
tree3eca98ea42fcab63540b06f290e12fe13d45fafc /lib
parente1b708897ea547f25fbc5fc1f73bb2b0738c5757 (diff)
downloadFreeBSD-src-bc77a8346240746144dcde0fd516c9c5bc18c02e.zip
FreeBSD-src-bc77a8346240746144dcde0fd516c9c5bc18c02e.tar.gz
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...)
Diffstat (limited to 'lib')
-rw-r--r--lib/libarchive/archive_private.h4
-rw-r--r--lib/libarchive/archive_read.c29
-rw-r--r--lib/libarchive/archive_virtual.c18
-rw-r--r--lib/libarchive/archive_write.c4
-rw-r--r--lib/libarchive/archive_write_disk.c4
5 files changed, 42 insertions, 17 deletions
diff --git a/lib/libarchive/archive_private.h b/lib/libarchive/archive_private.h
index 81eb49c..658c833 100644
--- a/lib/libarchive/archive_private.h
+++ b/lib/libarchive/archive_private.h
@@ -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 *);
diff --git a/lib/libarchive/archive_read.c b/lib/libarchive/archive_read.c
index 4e307ae..dcf1746 100644
--- a/lib/libarchive/archive_read.c
+++ b/lib/libarchive/archive_read.c
@@ -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_filter *self)
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 *_a,
* 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;
diff --git a/lib/libarchive/archive_virtual.c b/lib/libarchive/archive_virtual.c
index 6b7b12e..214e381 100644
--- a/lib/libarchive/archive_virtual.c
+++ b/lib/libarchive/archive_virtual.c
@@ -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));
diff --git a/lib/libarchive/archive_write.c b/lib/libarchive/archive_write.c
index ea09763..f1c3d23 100644
--- a/lib/libarchive/archive_write.c
+++ b/lib/libarchive/archive_write.c
@@ -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;
diff --git a/lib/libarchive/archive_write_disk.c b/lib/libarchive/archive_write_disk.c
index a1eaf28..a6b7ffc 100644
--- a/lib/libarchive/archive_write_disk.c
+++ b/lib/libarchive/archive_write_disk.c
@@ -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;
OpenPOWER on IntegriCloud