parent
ef68dd4a92
commit
df254ce03b
|
@ -812,6 +812,31 @@ 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)
|
||||||
|
{
|
||||||
|
// Using lseek() and read() is more portable than pread() and
|
||||||
|
// for us it is as good as real pread().
|
||||||
|
if (lseek(pair->src_fd, pos, SEEK_SET) != pos) {
|
||||||
|
message_error(_("%s: Error seeking the file: %s"),
|
||||||
|
pair->src_name, strerror(errno));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t amount = io_read(pair, buf, size);
|
||||||
|
if (amount == SIZE_MAX)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (amount != size) {
|
||||||
|
message_error(_("%s: Unexpected end of file"),
|
||||||
|
pair->src_name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
is_sparse(const io_buf *buf)
|
is_sparse(const io_buf *buf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
/// Use an union to make sure that the buffer is properly aligned.
|
/// Use an union to make sure that the buffer is properly aligned.
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t u8[IO_BUFFER_SIZE];
|
uint8_t u8[IO_BUFFER_SIZE];
|
||||||
|
uint32_t u32[IO_BUFFER_SIZE / sizeof(uint32_t)];
|
||||||
uint64_t u64[IO_BUFFER_SIZE / sizeof(uint64_t)];
|
uint64_t u64[IO_BUFFER_SIZE / sizeof(uint64_t)];
|
||||||
} io_buf;
|
} io_buf;
|
||||||
|
|
||||||
|
@ -97,6 +98,22 @@ extern void io_close(file_pair *pair, bool success);
|
||||||
extern size_t io_read(file_pair *pair, io_buf *buf, size_t size);
|
extern size_t io_read(file_pair *pair, io_buf *buf, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/// \brief Read from source file from given offset to a buffer
|
||||||
|
///
|
||||||
|
/// This is remotely similar to standard pread(). This uses lseek() though,
|
||||||
|
/// so the read offset is changed on each call.
|
||||||
|
///
|
||||||
|
/// \param pair Seekable source file
|
||||||
|
/// \param buf Destination buffer
|
||||||
|
/// \param size Amount of data to read
|
||||||
|
/// \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_pread(file_pair *pair, io_buf *buf, size_t size, off_t pos);
|
||||||
|
|
||||||
|
|
||||||
/// \brief Writes a buffer to the destination file
|
/// \brief Writes a buffer to the destination file
|
||||||
///
|
///
|
||||||
/// \param pair File pair having the destination file open for writing
|
/// \param pair File pair having the destination file open for writing
|
||||||
|
|
Loading…
Reference in New Issue