From 01d24bec2110ac432482e6bcb3d6a8ca1f5128a1 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Sun, 21 Mar 2010 00:20:06 -0400 Subject: [PATCH] archive_read_skip_lenient() (which just returns the number of bytes actually skipped) was only used one place as a building block for a "skip rest of file" operation. So push the "skip rest of file" into archive_read.c as __archive_read_skip_all(), remove skip_lenient entirely, and modify the raw_read_data_skip to use the new function. SVN-Revision: 2043 --- libarchive/archive_read.c | 18 +++++++++++++++--- libarchive/archive_read_private.h | 2 +- libarchive/archive_read_support_format_raw.c | 17 +++++------------ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 5cb3f341b..58080ebce 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -1224,7 +1224,7 @@ __archive_read_filter_consume(struct archive_read_filter * filter, int64_t __archive_read_skip(struct archive_read *a, int64_t request) { - int64_t skipped = __archive_read_skip_lenient(a, request); + int64_t skipped = _archive_read_filter_skip(a->filter, request); if (skipped == request) return (skipped); /* We hit EOF before we satisfied the skip request. */ @@ -1238,11 +1238,23 @@ __archive_read_skip(struct archive_read *a, int64_t request) } int64_t -__archive_read_skip_lenient(struct archive_read *a, int64_t request) +__archive_read_skip_all(struct archive_read *a) { - return (_archive_read_filter_skip(a->filter, request)); + int64_t total_bytes_skipped = 0; + off_t bytes_skipped; + int64_t request = 1024 * 1024 * 1024UL; /* Skip 1 GB at a time. */ + + for (;;) { + bytes_skipped = _archive_read_filter_skip(a->filter, request); + if (bytes_skipped < 0) + return (ARCHIVE_FATAL); + total_bytes_skipped += bytes_skipped; + if (bytes_skipped < request) + return (total_bytes_skipped); + } } + static int64_t _archive_read_filter_skip(struct archive_read_filter *filter, int64_t request) { diff --git a/libarchive/archive_read_private.h b/libarchive/archive_read_private.h index 2174e893a..1d41d59fb 100644 --- a/libarchive/archive_read_private.h +++ b/libarchive/archive_read_private.h @@ -211,6 +211,6 @@ const void *__archive_read_filter_ahead(struct archive_read_filter *, ssize_t __archive_read_consume(struct archive_read *, size_t); ssize_t __archive_read_filter_consume(struct archive_read_filter *, size_t); int64_t __archive_read_skip(struct archive_read *, int64_t); -int64_t __archive_read_skip_lenient(struct archive_read *, int64_t); +int64_t __archive_read_skip_all(struct archive_read *); int __archive_read_program(struct archive_read_filter *, const char *); #endif diff --git a/libarchive/archive_read_support_format_raw.c b/libarchive/archive_read_support_format_raw.c index ea7b26c30..fafb5bfe6 100644 --- a/libarchive/archive_read_support_format_raw.c +++ b/libarchive/archive_read_support_format_raw.c @@ -168,24 +168,17 @@ archive_read_format_raw_read_data(struct archive_read *a, static int archive_read_format_raw_read_data_skip(struct archive_read *a) { + int64_t skipped; struct raw_info *info; - off_t bytes_skipped; - int64_t request = 1024 * 1024 * 1024UL; /* Skip 1 GB at a time. */ info = (struct raw_info *)(a->format->data); if (info->end_of_file) return (ARCHIVE_EOF); info->end_of_file = 1; - - for (;;) { - bytes_skipped = __archive_read_skip_lenient(a, request); - if (bytes_skipped < 0) - return (ARCHIVE_FATAL); - if (bytes_skipped < request) - return (ARCHIVE_OK); - /* We skipped all the bytes we asked for. There might - * be more, so try again. */ - } + skipped = __archive_read_skip_all(a); + if (skipped < 0) + return ((int)skipped); + return (ARCHIVE_OK); } static int -- 2.47.3