summaryrefslogtreecommitdiff
path: root/libarchive/archive_read.c
diff options
context:
space:
mode:
authorPaul Harris <paulharris@computer.org>2015-06-30 16:04:59 +0800
committerPaul Harris <paulharris@computer.org>2015-06-30 16:04:59 +0800
commit41965bf9e02795168cced94985916c415064a04b (patch)
treeb0cc703d44b98e5fe3d77d6b282842b52f4fc972 /libarchive/archive_read.c
parent5cb5a0cccf987badba8584f3f0be8b6b2bcd2c7b (diff)
downloadlibarchive-41965bf9e02795168cced94985916c415064a04b.tar.gz
Add support for archive_read_data() for read_disk archives.
Hoisted the relevant archive_read variables into the common archive struct.
Diffstat (limited to 'libarchive/archive_read.c')
-rw-r--r--libarchive/archive_read.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c
index 11f7a0b7..56dd8877 100644
--- a/libarchive/archive_read.c
+++ b/libarchive/archive_read.c
@@ -667,10 +667,8 @@ _archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
break;
}
- a->read_data_output_offset = 0;
- a->read_data_remaining = 0;
- a->read_data_is_posix_read = 0;
- a->read_data_requested = 0;
+ __archive_reset_read_data(&a->archive);
+
a->data_start_node = a->client.cursor;
/* EOF always wins; otherwise return the worst error. */
return (r2 < r1 || r2 == ARCHIVE_EOF) ? r2 : r1;
@@ -822,7 +820,7 @@ archive_read_format_capabilities(struct archive *_a)
ssize_t
archive_read_data(struct archive *_a, void *buff, size_t s)
{
- struct archive_read *a = (struct archive_read *)_a;
+ struct archive *a = (struct archive *)_a;
char *dest;
const void *read_buf;
size_t bytes_read;
@@ -837,7 +835,7 @@ archive_read_data(struct archive *_a, void *buff, size_t s)
read_buf = a->read_data_block;
a->read_data_is_posix_read = 1;
a->read_data_requested = s;
- r = _archive_read_data_block(&a->archive, &read_buf,
+ r = archive_read_data_block(a, &read_buf,
&a->read_data_remaining, &a->read_data_offset);
a->read_data_block = read_buf;
if (r == ARCHIVE_EOF)
@@ -852,7 +850,7 @@ archive_read_data(struct archive *_a, void *buff, size_t s)
}
if (a->read_data_offset < a->read_data_output_offset) {
- archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT,
"Encountered out-of-order sparse blocks");
return (ARCHIVE_RETRY);
}
@@ -895,6 +893,26 @@ archive_read_data(struct archive *_a, void *buff, size_t s)
return (bytes_read);
}
+
+
+ /*
+ * Reset the read_data_* variables, used for starting a new entry.
+ */
+void __archive_reset_read_data(struct archive * a)
+{
+ a->read_data_output_offset = 0;
+ a->read_data_remaining = 0;
+ a->read_data_is_posix_read = 0;
+ a->read_data_requested = 0;
+
+ /* extra resets, from rar.c */
+ a->read_data_block = NULL;
+ a->read_data_offset = 0;
+}
+
+
+
+
/*
* Skip over all remaining data in this entry.
*/