aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2017-04-05 18:47:22 +0300
committerLasse Collin <lasse.collin@tukaani.org>2017-04-05 18:47:22 +0300
commitc28f0b3d00af87b92dda229831548d8eb0067d1d (patch)
treeab2aa7f93c98a2ad9a5dfcdd705cbb061bf00ce2
parentxz: Use POSIX_FADV_RANDOM for in "xz --list" mode. (diff)
downloadxz-c28f0b3d00af87b92dda229831548d8eb0067d1d.tar.xz
xz: Add io_seek_src().
-rw-r--r--src/xz/file_io.c20
-rw-r--r--src/xz/file_io.h13
2 files changed, 30 insertions, 3 deletions
diff --git a/src/xz/file_io.c b/src/xz/file_io.c
index 041bed88..48ef8223 100644
--- a/src/xz/file_io.c
+++ b/src/xz/file_io.c
@@ -1169,16 +1169,30 @@ io_read(file_pair *pair, io_buf *buf_union, size_t size)
extern bool
-io_pread(file_pair *pair, io_buf *buf, size_t size, off_t pos)
+io_seek_src(file_pair *pair, off_t pos)
{
- // Using lseek() and read() is more portable than pread() and
- // for us it is as good as real pread().
+ assert(pos >= 0);
+
if (lseek(pair->src_fd, pos, SEEK_SET) != pos) {
message_error(_("%s: Error seeking the file: %s"),
pair->src_name, strerror(errno));
return true;
}
+ pair->src_eof = false;
+
+ return false;
+}
+
+
+extern bool
+io_pread(file_pair *pair, io_buf *buf, size_t size, off_t pos)
+{
+ // Using lseek() and read() is more portable than pread() and
+ // for us it is as good as real pread().
+ if (io_seek_src(pair, pos))
+ return true;
+
const size_t amount = io_read(pair, buf, size);
if (amount == SIZE_MAX)
return true;
diff --git a/src/xz/file_io.h b/src/xz/file_io.h
index 6722aef8..84d5b44d 100644
--- a/src/xz/file_io.h
+++ b/src/xz/file_io.h
@@ -129,6 +129,19 @@ extern size_t io_read(file_pair *pair, io_buf *buf, size_t size);
extern void io_fix_src_pos(file_pair *pair, size_t rewind_size);
+/// \brief Seek to the given absolute position in the source file
+///
+/// This calls lseek() and also clears pair->src_eof.
+///
+/// \param pair Seekable source file
+/// \param pos Offset relative to the beginning of the file,
+/// from which the data should be read.
+///
+/// \return On success, false is returned. On error, error message
+/// is printed and true is returned.
+extern bool io_seek_src(file_pair *pair, off_t pos);
+
+
/// \brief Read from source file from given offset to a buffer
///
/// This is remotely similar to standard pread(). This uses lseek() though,