aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/liblzma/api/lzma/base.h31
-rw-r--r--src/liblzma/common/common.c12
-rw-r--r--src/xz/message.c1
3 files changed, 42 insertions, 2 deletions
diff --git a/src/liblzma/api/lzma/base.h b/src/liblzma/api/lzma/base.h
index a6005acc..9b3e9e1a 100644
--- a/src/liblzma/api/lzma/base.h
+++ b/src/liblzma/api/lzma/base.h
@@ -234,6 +234,23 @@ typedef enum {
* can be a sign of a bug in liblzma. See the documentation
* how to report bugs.
*/
+
+ LZMA_SEEK = 12
+ /**<
+ * \brief Request to change the input file position
+ *
+ * Some coders can do random access in the input file. The
+ * initialization functions of these coders take the file size
+ * as an argument. No other coders can return LZMA_SEEK.
+ *
+ * When this value is returned, the application must seek to
+ * the file position given in lzma_stream.seek_in. This value
+ * is guaranteed to never exceed the file size that was
+ * specified at the coder initialization.
+ *
+ * After seeking the application should read new input and
+ * pass it normally via lzma_stream.next_in and .avail_in.
+ */
} lzma_ret;
@@ -514,7 +531,19 @@ typedef struct {
void *reserved_ptr2;
void *reserved_ptr3;
void *reserved_ptr4;
- uint64_t reserved_int1;
+
+ /**
+ * \brief New seek input position for LZMA_SEEK
+ *
+ * When lzma_code() returns LZMA_SEEK, the new input position needed
+ * by liblzma will be available seek_in. The value is guaranteed to
+ * not exceed the file size that was specified when this lzma_stream
+ * was initialized.
+ *
+ * In all other situations the value of this variable is undefined.
+ */
+ uint64_t seek_in;
+
uint64_t reserved_int2;
size_t reserved_int3;
size_t reserved_int4;
diff --git a/src/liblzma/common/common.c b/src/liblzma/common/common.c
index 57e3f8eb..8ffe9764 100644
--- a/src/liblzma/common/common.c
+++ b/src/liblzma/common/common.c
@@ -207,7 +207,6 @@ lzma_code(lzma_stream *strm, lzma_action action)
|| strm->reserved_ptr2 != NULL
|| strm->reserved_ptr3 != NULL
|| strm->reserved_ptr4 != NULL
- || strm->reserved_int1 != 0
|| strm->reserved_int2 != 0
|| strm->reserved_int3 != 0
|| strm->reserved_int4 != 0
@@ -318,6 +317,17 @@ lzma_code(lzma_stream *strm, lzma_action action)
ret = LZMA_OK;
break;
+ case LZMA_SEEK:
+ strm->internal->allow_buf_error = false;
+
+ // If LZMA_FINISH was used, reset it back to the
+ // LZMA_RUN-based state so that new input can be supplied
+ // by the application.
+ if (strm->internal->sequence == ISEQ_FINISH)
+ strm->internal->sequence = ISEQ_RUN;
+
+ break;
+
case LZMA_STREAM_END:
if (strm->internal->sequence == ISEQ_SYNC_FLUSH
|| strm->internal->sequence == ISEQ_FULL_FLUSH
diff --git a/src/xz/message.c b/src/xz/message.c
index f88c1231..41de60c7 100644
--- a/src/xz/message.c
+++ b/src/xz/message.c
@@ -818,6 +818,7 @@ message_strm(lzma_ret code)
case LZMA_STREAM_END:
case LZMA_GET_CHECK:
case LZMA_PROG_ERROR:
+ case LZMA_SEEK:
// Without "default", compiler will warn if new constants
// are added to lzma_ret, it is not too easy to forget to
// add the new constants to this function.