From 4c3f3d5ee23dfa7ac5dd2eafdda892028bee4aaa Mon Sep 17 00:00:00 2001 From: Moinak Ghosh Date: Mon, 22 Sep 2014 21:21:52 +0530 Subject: [PATCH] Libarchive tweaks to indicate data vs metadata reads and writes. --- archive/libarchive/libarchive/archive.h | 8 ++++++ .../libarchive/libarchive/archive_private.h | 8 ++++++ .../libarchive/libarchive/archive_virtual.c | 27 ++++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/archive/libarchive/libarchive/archive.h b/archive/libarchive/libarchive/archive.h index f56bc38..7c5adef 100644 --- a/archive/libarchive/libarchive/archive.h +++ b/archive/libarchive/libarchive/archive.h @@ -510,6 +510,14 @@ __LA_DECL int archive_read_set_option(struct archive *_a, __LA_DECL int archive_read_set_options(struct archive *_a, const char *opts); +/* + * This call has meaning inside a read or write client callback. + * It returns the metadata flag, which indicates whether the current + * request is for a metadata read/write. This allows clients filters + * to separately handle/store data and metadata. + */ +__LA_DECL int archive_request_is_metadata(struct archive *a); + /*- * Convenience function to recreate the current entry (whose header * has just been read) on disk. diff --git a/archive/libarchive/libarchive/archive_private.h b/archive/libarchive/libarchive/archive_private.h index 30d472f..720de77 100644 --- a/archive/libarchive/libarchive/archive_private.h +++ b/archive/libarchive/libarchive/archive_private.h @@ -119,6 +119,14 @@ struct archive { unsigned current_codepage; /* Current ACP(ANSI CodePage). */ unsigned current_oemcp; /* Current OEMCP(OEM CodePage). */ struct archive_string_conv *sconv; + + /* + * This flag is only used when invoking read/write callbacks. It + * tells the callback routine whether a metadata read or write is + * being requested. This lets higher-level processing routines to + * separately store/handle metadata and data. + */ + int cb_is_metadata; }; /* Check magic value and state; return(ARCHIVE_FATAL) if it isn't valid. */ diff --git a/archive/libarchive/libarchive/archive_virtual.c b/archive/libarchive/libarchive/archive_virtual.c index 0c4155f..5ab26b6 100644 --- a/archive/libarchive/libarchive/archive_virtual.c +++ b/archive/libarchive/libarchive/archive_virtual.c @@ -110,8 +110,13 @@ archive_read_finish(struct archive *a) int archive_write_header(struct archive *a, struct archive_entry *entry) { + int rv; + ++a->file_count; - return ((a->vtable->archive_write_header)(a, entry)); + a->cb_is_metadata = 1; + rv = (a->vtable->archive_write_header)(a, entry); + a->cb_is_metadata = 0; + return (rv); } int @@ -141,13 +146,23 @@ archive_write_data_block(struct archive *a, const void *buff, size_t s, int64_t int archive_read_next_header(struct archive *a, struct archive_entry **entry) { - return ((a->vtable->archive_read_next_header)(a, entry)); + int rv; + + a->cb_is_metadata = 1; + rv = (a->vtable->archive_read_next_header)(a, entry); + a->cb_is_metadata = 0; + return (rv); } int archive_read_next_header2(struct archive *a, struct archive_entry *entry) { - return ((a->vtable->archive_read_next_header2)(a, entry)); + int rv; + + a->cb_is_metadata = 1; + rv = (a->vtable->archive_read_next_header2)(a, entry); + a->cb_is_metadata = 0; + return (rv); } int @@ -156,3 +171,9 @@ archive_read_data_block(struct archive *a, { return ((a->vtable->archive_read_data_block)(a, buff, s, o)); } + +int +archive_request_is_metadata(struct archive *a) +{ + return (a->cb_is_metadata); +}