diff options
author | kientzle <kientzle@FreeBSD.org> | 2009-03-05 21:18:10 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2009-03-05 21:18:10 +0000 |
commit | bc77a8346240746144dcde0fd516c9c5bc18c02e (patch) | |
tree | 3eca98ea42fcab63540b06f290e12fe13d45fafc /lib | |
parent | e1b708897ea547f25fbc5fc1f73bb2b0738c5757 (diff) | |
download | FreeBSD-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.h | 4 | ||||
-rw-r--r-- | lib/libarchive/archive_read.c | 29 | ||||
-rw-r--r-- | lib/libarchive/archive_virtual.c | 18 | ||||
-rw-r--r-- | lib/libarchive/archive_write.c | 4 | ||||
-rw-r--r-- | lib/libarchive/archive_write_disk.c | 4 |
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; |