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;
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);
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 */
const char *name;
int code;
+ int can_skip;
int can_seek;
/* Used by reblocking logic. */
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);
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 */
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;
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);
self->data = state;
self->read = lzop_filter_read;
- self->skip = NULL; /* not supported */
self->close = lzop_filter_close;
return (ARCHIVE_OK);
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? */
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);
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);
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;
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;