]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
archive_read_skip_lenient() (which just returns the number of bytes actually
authorTim Kientzle <kientzle@gmail.com>
Sun, 21 Mar 2010 04:20:06 +0000 (00:20 -0400)
committerTim Kientzle <kientzle@gmail.com>
Sun, 21 Mar 2010 04:20:06 +0000 (00:20 -0400)
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
libarchive/archive_read_private.h
libarchive/archive_read_support_format_raw.c

index 5cb3f341bce4b762fb046511d74b49d915bf2f0b..58080ebce0943f6b873aa45900dc7a61a6025160 100644 (file)
@@ -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)
 {
index 2174e893a5d0bf573eb7de9f4fd7aa198d300f43..1d41d59fba7f71e9997fa44de115381b8fd683ae 100644 (file)
@@ -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
index ea7b26c3083fe75a0b7ab985776e7b650c4cfc95..fafb5bfe6de4795264934e39bbbc8feb01ae8642 100644 (file)
@@ -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