summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2004-04-28 04:41:27 +0000
committerkientzle <kientzle@FreeBSD.org>2004-04-28 04:41:27 +0000
commit4f6d19ce20f8f561fa9e1fe7261d5a9991cd68de (patch)
treebde271e0176f2528e906220fb052eacb00d57033 /lib
parentd6382fb16020a26e25981a0a7a51cb75aa79485e (diff)
downloadFreeBSD-src-4f6d19ce20f8f561fa9e1fe7261d5a9991cd68de.zip
FreeBSD-src-4f6d19ce20f8f561fa9e1fe7261d5a9991cd68de.tar.gz
Add statistics: track offset in compressed and uncompressed archive,
provide an interface for the client to query this information.
Diffstat (limited to 'lib')
-rw-r--r--lib/libarchive/archive.h5
-rw-r--r--lib/libarchive/archive.h.in5
-rw-r--r--lib/libarchive/archive_private.h2
-rw-r--r--lib/libarchive/archive_read_support_compression_bzip2.c1
-rw-r--r--lib/libarchive/archive_read_support_compression_gzip.c1
-rw-r--r--lib/libarchive/archive_read_support_compression_none.c1
-rw-r--r--lib/libarchive/archive_util.c20
-rw-r--r--lib/libarchive/archive_write_set_compression_bzip2.c3
-rw-r--r--lib/libarchive/archive_write_set_compression_gzip.c2
-rw-r--r--lib/libarchive/archive_write_set_compression_none.c4
10 files changed, 43 insertions, 1 deletions
diff --git a/lib/libarchive/archive.h b/lib/libarchive/archive.h
index 1ac0b2b..7918310 100644
--- a/lib/libarchive/archive.h
+++ b/lib/libarchive/archive.h
@@ -257,6 +257,11 @@ void archive_write_finish(struct archive *);
* 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 *);
+/* Bytes written to compressor or read from decompressor. */
+int64_t archive_position_uncompressed(struct archive *);
+
const char *archive_compression_name(struct archive *);
int archive_compression(struct archive *);
int archive_errno(struct archive *);
diff --git a/lib/libarchive/archive.h.in b/lib/libarchive/archive.h.in
index 1ac0b2b..7918310 100644
--- a/lib/libarchive/archive.h.in
+++ b/lib/libarchive/archive.h.in
@@ -257,6 +257,11 @@ void archive_write_finish(struct archive *);
* 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 *);
+/* Bytes written to compressor or read from decompressor. */
+int64_t archive_position_uncompressed(struct archive *);
+
const char *archive_compression_name(struct archive *);
int archive_compression(struct archive *);
int archive_errno(struct archive *);
diff --git a/lib/libarchive/archive_private.h b/lib/libarchive/archive_private.h
index 83fddc3..ab224b7 100644
--- a/lib/libarchive/archive_private.h
+++ b/lib/libarchive/archive_private.h
@@ -99,6 +99,8 @@ struct archive {
/* Position in UNCOMPRESSED data stream. */
off_t file_position;
+ /* Position in COMPRESSED data stream. */
+ off_t raw_position;
/* File offset of beginning of most recently-read header. */
off_t header_position;
diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c
index 313c212..99acc62 100644
--- a/lib/libarchive/archive_read_support_compression_bzip2.c
+++ b/lib/libarchive/archive_read_support_compression_bzip2.c
@@ -325,6 +325,7 @@ drive_decompressor(struct archive *a, struct private_data *state)
a->compression_name);
return (ARCHIVE_FATAL);
}
+ a->raw_position += ret;
state->stream.avail_in = ret;
}
diff --git a/lib/libarchive/archive_read_support_compression_gzip.c b/lib/libarchive/archive_read_support_compression_gzip.c
index ba1adec..c7622a3 100644
--- a/lib/libarchive/archive_read_support_compression_gzip.c
+++ b/lib/libarchive/archive_read_support_compression_gzip.c
@@ -335,6 +335,7 @@ drive_decompressor(struct archive *a, struct private_data *state)
a->compression_name);
return (ARCHIVE_FATAL);
}
+ a->raw_position += ret;
state->stream.avail_in = ret;
}
diff --git a/lib/libarchive/archive_read_support_compression_none.c b/lib/libarchive/archive_read_support_compression_none.c
index 9aeff5f..48e3ea4 100644
--- a/lib/libarchive/archive_read_support_compression_none.c
+++ b/lib/libarchive/archive_read_support_compression_none.c
@@ -180,6 +180,7 @@ archive_decompressor_none_read_ahead(struct archive *a, const void **buff,
state->end_of_file = 1;
break;
}
+ a->raw_position += bytes_read;
state->client_total = bytes_read;
state->client_avail = state->client_total;
state->client_next = state->client_buff;
diff --git a/lib/libarchive/archive_util.c b/lib/libarchive/archive_util.c
index 99aa136..065a8fe 100644
--- a/lib/libarchive/archive_util.c
+++ b/lib/libarchive/archive_util.c
@@ -76,6 +76,26 @@ archive_compression_name(struct archive *a)
return (a->compression_name);
}
+
+/*
+ * Return a count of the number of compressed bytes processed.
+ */
+int64_t
+archive_position_compressed(struct archive *a)
+{
+ return (a->raw_position);
+}
+
+/*
+ * Return a count of the number of uncompressed bytes processed.
+ */
+int64_t
+archive_position_uncompressed(struct archive *a)
+{
+ return (a->file_position);
+}
+
+
void
archive_set_error(struct archive *a, int error_number, const char *fmt, ...)
{
diff --git a/lib/libarchive/archive_write_set_compression_bzip2.c b/lib/libarchive/archive_write_set_compression_bzip2.c
index 85e4870..f044a0c 100644
--- a/lib/libarchive/archive_write_set_compression_bzip2.c
+++ b/lib/libarchive/archive_write_set_compression_bzip2.c
@@ -172,6 +172,7 @@ archive_compressor_bzip2_write(struct archive *a, const void *buff,
state->stream.avail_in = length;
if (drive_compressor(a, state, 0))
return (-1);
+ a->file_position += length;
return (length);
}
@@ -244,6 +245,7 @@ archive_compressor_bzip2_finish(struct archive *a)
ret = (a->client_writer)(a, a->client_data, state->compressed,
block_length);
+ a->raw_position += ret;
if (ret != 0)
goto cleanup;
@@ -295,6 +297,7 @@ drive_compressor(struct archive *a, struct private_data *state, int finishing)
state->compressed_buffer_size - ret);
}
+ a->raw_position += ret;
state->stream.next_out = state->compressed +
state->compressed_buffer_size - ret;
state->stream.avail_out = ret;
diff --git a/lib/libarchive/archive_write_set_compression_gzip.c b/lib/libarchive/archive_write_set_compression_gzip.c
index b09fc2b..6832d97 100644
--- a/lib/libarchive/archive_write_set_compression_gzip.c
+++ b/lib/libarchive/archive_write_set_compression_gzip.c
@@ -200,6 +200,7 @@ archive_compressor_gzip_write(struct archive *a, const void *buff,
if ((ret = drive_compressor(a, state, 0)) != ARCHIVE_OK)
return (ret);
+ a->file_position += length;
return (length);
}
@@ -270,6 +271,7 @@ archive_compressor_gzip_finish(struct archive *a)
if (tocopy < 8) {
ret = (a->client_writer)(a, a->client_data, state->compressed,
state->compressed_buffer_size);
+ a->raw_position += ret;
state->stream.next_out = state->compressed;
state->stream.avail_out = state->compressed_buffer_size;
memcpy(state->stream.next_out, trailer + tocopy, 8-tocopy);
diff --git a/lib/libarchive/archive_write_set_compression_none.c b/lib/libarchive/archive_write_set_compression_none.c
index ea600dd..99347b0 100644
--- a/lib/libarchive/archive_write_set_compression_none.c
+++ b/lib/libarchive/archive_write_set_compression_none.c
@@ -131,7 +131,8 @@ archive_compressor_none_write(struct archive *a, const void *vbuff,
if (state->avail == 0) {
ret = (a->client_writer)(a, a->client_data,
state->buffer, state->buffer_size);
- /* TODO: if ret < state->buffer_size */
+ /* XXX TODO: if ret < state->buffer_size XXX */
+ a->raw_position += ret;
state->next = state->buffer;
state->avail = state->buffer_size;
}
@@ -145,6 +146,7 @@ archive_compressor_none_write(struct archive *a, const void *vbuff,
buff += to_copy;
remaining -= to_copy;
}
+ a->file_position += length;
return (length);
}
OpenPOWER on IntegriCloud