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. */
}
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)
{
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
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