xz: Add io_seek_src().

This commit is contained in:
Lasse Collin 2017-04-05 18:47:22 +03:00
parent bba477257d
commit c28f0b3d00
2 changed files with 30 additions and 3 deletions

View File

@ -1169,16 +1169,30 @@ io_read(file_pair *pair, io_buf *buf_union, size_t size)
extern bool 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 assert(pos >= 0);
// for us it is as good as real pread().
if (lseek(pair->src_fd, pos, SEEK_SET) != pos) { if (lseek(pair->src_fd, pos, SEEK_SET) != pos) {
message_error(_("%s: Error seeking the file: %s"), message_error(_("%s: Error seeking the file: %s"),
pair->src_name, strerror(errno)); pair->src_name, strerror(errno));
return true; 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); const size_t amount = io_read(pair, buf, size);
if (amount == SIZE_MAX) if (amount == SIZE_MAX)
return true; return true;

View File

@ -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); 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 /// \brief Read from source file from given offset to a buffer
/// ///
/// This is remotely similar to standard pread(). This uses lseek() though, /// This is remotely similar to standard pread(). This uses lseek() though,