From: Brian Harring Date: Fri, 24 Sep 2010 05:27:00 +0000 (-0400) Subject: update raw w/ proper read_ahead/consume pairing X-Git-Tag: v3.0.0a~882 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee52be75e2e4797b5a917e7699be417a94d77542;p=thirdparty%2Flibarchive.git update raw w/ proper read_ahead/consume pairing SVN-Revision: 2695 --- diff --git a/libarchive/archive_read_support_format_raw.c b/libarchive/archive_read_support_format_raw.c index 65d559fa2..4a0b5195c 100644 --- a/libarchive/archive_read_support_format_raw.c +++ b/libarchive/archive_read_support_format_raw.c @@ -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); }