diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2017-04-05 18:47:22 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2017-04-05 18:47:22 +0300 |
commit | c28f0b3d00af87b92dda229831548d8eb0067d1d (patch) | |
tree | ab2aa7f93c98a2ad9a5dfcdd705cbb061bf00ce2 /src | |
parent | xz: Use POSIX_FADV_RANDOM for in "xz --list" mode. (diff) | |
download | xz-c28f0b3d00af87b92dda229831548d8eb0067d1d.tar.xz |
xz: Add io_seek_src().
Diffstat (limited to 'src')
-rw-r--r-- | src/xz/file_io.c | 20 | ||||
-rw-r--r-- | src/xz/file_io.h | 13 |
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, |