From: Tim Kientzle Date: Sun, 21 Mar 2010 04:20:06 +0000 (-0400) Subject: archive_read_skip_lenient() (which just returns the number of bytes actually X-Git-Tag: v3.0.0a~1149 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=01d24bec2110ac432482e6bcb3d6a8ca1f5128a1;p=thirdparty%2Flibarchive.git 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 --- 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