diff options
author | Paul Harris <paulharris@computer.org> | 2015-06-30 16:04:59 +0800 |
---|---|---|
committer | Paul Harris <paulharris@computer.org> | 2015-06-30 16:04:59 +0800 |
commit | 41965bf9e02795168cced94985916c415064a04b (patch) | |
tree | b0cc703d44b98e5fe3d77d6b282842b52f4fc972 /libarchive/archive_read.c | |
parent | 5cb5a0cccf987badba8584f3f0be8b6b2bcd2c7b (diff) | |
download | libarchive-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.c | 32 |
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. */ |