Index: xz/src/xz/file_io.h |
=================================================================== |
--- xz/src/xz/file_io.h (revision 0) |
+++ xz/src/xz/file_io.h (revision 0) |
@@ -0,0 +1,129 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file file_io.h |
+/// \brief I/O types and functions |
+// |
+// Author: Lasse Collin |
+// |
+// This file has been put into the public domain. |
+// You can do whatever you want with this file. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+// Some systems have suboptimal BUFSIZ. Use a bit bigger value on them. |
+// We also need that IO_BUFFER_SIZE is a multiple of 8 (sizeof(uint64_t)) |
+#if BUFSIZ <= 1024 |
+# define IO_BUFFER_SIZE 8192 |
+#else |
+# define IO_BUFFER_SIZE (BUFSIZ & ~7U) |
+#endif |
+ |
+ |
+/// is_sparse() accesses the buffer as uint64_t for maximum speed. |
+/// Use an union to make sure that the buffer is properly aligned. |
+typedef union { |
+ uint8_t u8[IO_BUFFER_SIZE]; |
+ uint32_t u32[IO_BUFFER_SIZE / sizeof(uint32_t)]; |
+ uint64_t u64[IO_BUFFER_SIZE / sizeof(uint64_t)]; |
+} io_buf; |
+ |
+ |
+typedef struct { |
+ /// Name of the source filename (as given on the command line) or |
+ /// pointer to static "(stdin)" when reading from standard input. |
+ const char *src_name; |
+ |
+ /// Destination filename converted from src_name or pointer to static |
+ /// "(stdout)" when writing to standard output. |
+ char *dest_name; |
+ |
+ /// File descriptor of the source file |
+ int src_fd; |
+ |
+ /// File descriptor of the target file |
+ int dest_fd; |
+ |
+ /// True once end of the source file has been detected. |
+ bool src_eof; |
+ |
+ /// If true, we look for long chunks of zeros and try to create |
+ /// a sparse file. |
+ bool dest_try_sparse; |
+ |
+ /// This is used only if dest_try_sparse is true. This holds the |
+ /// number of zero bytes we haven't written out, because we plan |
+ /// to make that byte range a sparse chunk. |
+ off_t dest_pending_sparse; |
+ |
+ /// Stat of the source file. |
+ struct stat src_st; |
+ |
+ /// Stat of the destination file. |
+ struct stat dest_st; |
+ |
+} file_pair; |
+ |
+ |
+/// \brief Initialize the I/O module |
+extern void io_init(void); |
+ |
+ |
+/// \brief Disable creation of sparse files when decompressing |
+extern void io_no_sparse(void); |
+ |
+ |
+/// \brief Open the source file |
+extern file_pair *io_open_src(const char *src_name); |
+ |
+ |
+/// \brief Open the destination file |
+extern bool io_open_dest(file_pair *pair); |
+ |
+ |
+/// \brief Closes the file descriptors and frees possible allocated memory |
+/// |
+/// The success argument determines if source or destination file gets |
+/// unlinked: |
+/// - false: The destination file is unlinked. |
+/// - true: The source file is unlinked unless writing to stdout or --keep |
+/// was used. |
+extern void io_close(file_pair *pair, bool success); |
+ |
+ |
+/// \brief Reads from the source file to a buffer |
+/// |
+/// \param pair File pair having the source file open for reading |
+/// \param buf Destination buffer to hold the read data |
+/// \param size Size of the buffer; assumed be smaller than SSIZE_MAX |
+/// |
+/// \return On success, number of bytes read is returned. On end of |
+/// file zero is returned and pair->src_eof set to true. |
+/// On error, SIZE_MAX is returned and error message printed. |
+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 |
+/// |
+/// \param pair File pair having the destination file open for writing |
+/// \param buf Buffer containing the data to be written |
+/// \param size Size of the buffer; assumed be smaller than SSIZE_MAX |
+/// |
+/// \return On success, zero is returned. On error, -1 is returned |
+/// and error message printed. |
+extern bool io_write(file_pair *pair, const io_buf *buf, size_t size); |
Property changes on: xz/src/xz/file_io.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |