]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
reader: track read_filter "can_skip" with a flag
authorEmil Velikov <emil.l.velikov@gmail.com>
Mon, 30 Mar 2020 22:13:15 +0000 (23:13 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Sat, 23 Oct 2021 18:26:23 +0000 (19:26 +0100)
Analogous to the earlier "can_seek" change. Drop the function pointer
in favour of a flag. Over the years, with over a dozen filters, no
filters actually implemented it.

If at a point in the future that changes, one can reinstate it.

Alternatively one could use a ARCHIVE_FILTER_NONE check.

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
12 files changed:
libarchive/archive_read.c
libarchive/archive_read_private.h
libarchive/archive_read_support_filter_bzip2.c
libarchive/archive_read_support_filter_compress.c
libarchive/archive_read_support_filter_gzip.c
libarchive/archive_read_support_filter_lz4.c
libarchive/archive_read_support_filter_lzop.c
libarchive/archive_read_support_filter_program.c
libarchive/archive_read_support_filter_rpm.c
libarchive/archive_read_support_filter_uu.c
libarchive/archive_read_support_filter_xz.c
libarchive/archive_read_support_filter_zstd.c

index 0a749c81d1f5f2c91724bd4ed3e3dca133b8788e..9e9363d5797476a3f3bb646bbb092ae8065f311e 100644 (file)
@@ -488,11 +488,11 @@ archive_read_open1(struct archive *_a)
        filter->data = a->client.dataset[0].data;
        filter->open = client_open_proxy;
        filter->read = client_read_proxy;
-       filter->skip = client_skip_proxy;
        filter->close = client_close_proxy;
        filter->sswitch = client_switch_proxy;
        filter->name = "none";
        filter->code = ARCHIVE_FILTER_NONE;
+       filter->can_skip = 1;
        filter->can_seek = 1;
 
        a->client.dataset[0].begin_position = 0;
@@ -1563,8 +1563,8 @@ advance_file_pointer(struct archive_read_filter *filter, int64_t request)
                return (total_bytes_skipped);
 
        /* If there's an optimized skip function, use it. */
-       if (filter->skip != NULL) {
-               bytes_skipped = (filter->skip)(filter, request);
+       if (filter->can_skip != 0) {
+               bytes_skipped = client_skip_proxy(filter, request);
                if (bytes_skipped < 0) {        /* error */
                        filter->fatal = 1;
                        return (bytes_skipped);
index b555956699a1482db6833429db26318568a1592d..38605b8f4dd771fb0e918b79ed41ec232807d958 100644 (file)
@@ -91,8 +91,6 @@ struct archive_read_filter {
        int (*open)(struct archive_read_filter *self);
        /* Return next block. */
        ssize_t (*read)(struct archive_read_filter *, const void **);
-       /* Skip forward this many bytes. */
-       int64_t (*skip)(struct archive_read_filter *self, int64_t request);
        /* Close (just this filter) and free(self). */
        int (*close)(struct archive_read_filter *self);
        /* Function that handles switching from reading one block to the next/prev */
@@ -104,6 +102,7 @@ struct archive_read_filter {
 
        const char      *name;
        int              code;
+       int              can_skip;
        int              can_seek;
 
        /* Used by reblocking logic. */
index 52537d855f665f47f72c47d3d5530b9680a05419..d969383ef14ffc86ec157f8508654909058a77f7 100644 (file)
@@ -200,7 +200,6 @@ bzip2_reader_init(struct archive_read_filter *self)
        state->out_block_size = out_block_size;
        state->out_block = out_block;
        self->read = bzip2_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = bzip2_filter_close;
 
        return (ARCHIVE_OK);
index 36a708a1530a050f8dc33cbc871ad4f21f77c629..f278ac7d6b0221fec6ae2e2829bb4be75ec6bec5 100644 (file)
@@ -227,7 +227,6 @@ compress_bidder_init(struct archive_read_filter *self)
        state->out_block_size = out_block_size;
        state->out_block = out_block;
        self->read = compress_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = compress_filter_close;
 
        /* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */
index 49bd46920710d6e9d3cff02c254132b268d48ba9..0a9c065a6ded5082d35c638a2d6bcf9321db9b34 100644 (file)
@@ -315,7 +315,6 @@ gzip_bidder_init(struct archive_read_filter *self)
        state->out_block_size = out_block_size;
        state->out_block = out_block;
        self->read = gzip_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = gzip_filter_close;
 #ifdef HAVE_ZLIB_H
        self->read_header = gzip_read_header;
index 8d44d30a760a11269328b52766ca3c6cd9bf14b0..082bb7fe74ce279053aae899a21fe3678613bc16 100644 (file)
@@ -229,7 +229,6 @@ lz4_reader_init(struct archive_read_filter *self)
        self->data = state;
        state->stage = SELECT_STREAM;
        self->read = lz4_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = lz4_filter_close;
 
        return (ARCHIVE_OK);
index 971f04ebf48f383a4f22c5bcce121537e0138760..98902bfd8a103c38fa1ecbc11b3ce53e8d515ac5 100644 (file)
@@ -189,7 +189,6 @@ lzop_bidder_init(struct archive_read_filter *self)
 
        self->data = state;
        self->read = lzop_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = lzop_filter_close;
 
        return (ARCHIVE_OK);
index 5d9d071923483d0f1dbf1b31d83c03e1a6332521..839354748143b037565ca6729cd99346727c918e 100644 (file)
@@ -429,7 +429,6 @@ __archive_read_program(struct archive_read_filter *self, const char *cmd)
 
        self->data = state;
        self->read = program_filter_read;
-       self->skip = NULL;
        self->close = program_filter_close;
 
        /* XXX Check that we can read at least one byte? */
index 73107e8688d805695ebea958b599ac736129277e..2cce174557663a98a54f41e78c64771b0af0034a 100644 (file)
@@ -135,7 +135,6 @@ rpm_bidder_init(struct archive_read_filter *self)
        self->code = ARCHIVE_FILTER_RPM;
        self->name = "rpm";
        self->read = rpm_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = rpm_filter_close;
 
        rpm = (struct rpm *)calloc(sizeof(*rpm), 1);
index 7a6da6a100fc7b2b59d6acc6aa9a7cdec54f493a..7252a6d6741621445a983db0af31b04dc219d4e3 100644 (file)
@@ -361,7 +361,6 @@ uudecode_bidder_init(struct archive_read_filter *self)
        self->code = ARCHIVE_FILTER_UU;
        self->name = "uu";
        self->read = uudecode_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = uudecode_filter_close;
 
        uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1);
index f557377f27bd3a0ab1cda87c93397864ddf219a3..e8b5300c58595ad5ba3c7e429e728a717de5e0df 100644 (file)
@@ -486,7 +486,6 @@ xz_lzma_bidder_init(struct archive_read_filter *self)
        state->out_block_size = out_block_size;
        state->out_block = out_block;
        self->read = xz_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = xz_filter_close;
 
        state->stream.avail_in = 0;
index b4528b35f2c4bc935e7c2fc8f6b0fd2718880020..f7e2923cfd1c4bf7df4bd53bd9413e434a861787 100644 (file)
@@ -190,7 +190,6 @@ zstd_bidder_init(struct archive_read_filter *self)
        state->out_block = out_block;
        state->dstream = dstream;
        self->read = zstd_filter_read;
-       self->skip = NULL; /* not supported */
        self->close = zstd_filter_close;
 
        state->eof = 0;