]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
update raw w/ proper read_ahead/consume pairing
authorBrian Harring <ferringb@gmail.com>
Fri, 24 Sep 2010 05:27:00 +0000 (01:27 -0400)
committerBrian Harring <ferringb@gmail.com>
Fri, 24 Sep 2010 05:27:00 +0000 (01:27 -0400)
SVN-Revision: 2695

libarchive/archive_read_support_format_raw.c

index 65d559fa2c3ffa94b988c4560c2078352474dc13..4a0b5195cffbfee21304b03066222f03b9d4fa5d 100644 (file)
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_raw.c 201107
 
 struct raw_info {
        int64_t offset; /* Current position in the file. */
+       int64_t unconsumed;
        int     end_of_file;
 };
 
@@ -128,6 +129,12 @@ archive_read_format_raw_read_data(struct archive_read *a,
        ssize_t avail;
 
        info = (struct raw_info *)(a->format->data);
+
+       if (info->unconsumed) {
+               __archive_read_consume(a, info->unconsumed);
+               info->unconsumed = 0;
+       }
+
        if (info->end_of_file)
                return (ARCHIVE_EOF);
 
@@ -139,6 +146,7 @@ archive_read_format_raw_read_data(struct archive_read *a,
                *size = avail;
                *offset = info->offset;
                info->offset += *size;
+               info->unconsumed = avail;
                return (ARCHIVE_OK);
        } else if (0 == avail) {
                /* Record and return end-of-file. */
@@ -157,7 +165,13 @@ archive_read_format_raw_read_data(struct archive_read *a,
 static int
 archive_read_format_raw_read_data_skip(struct archive_read *a)
 {
-       (void)a; /* UNUSED */
+       struct raw_info *info = (struct raw_info *)(a->format->data);
+
+       if (info->unconsumed) {
+               __archive_read_consume(a, info->unconsumed);
+               info->unconsumed = 0;
+       }
+
        return (ARCHIVE_OK);
 }