1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//! Random-access I/O
//!
//! This crate defines [`ReadAt`], [`WriteAt`], and [`EditAt`] traits which
//! define interfaces to random-access or seekable devices, such as normal
//! files, block devices, disk partitions, and memory buffers.
//!
//! It also defines [`RangeReader`], [`RangeWriter`], and [`RangeEditor`] types
//! which implement the above traits and and can be constructed from any
//! file-like type.  On Posix-ish platforms, including limited support for
//! WASI, these types just contain a single file descriptor (and implement
//! [`AsRawFd`]), plus any resources needed to safely hold the file descriptor
//! live. On Windows, they contain a single file handle (and implement
//! [`AsRawHandle`]).
//!
//! [`AsRawFd`]: https://doc.rust-lang.org/std/os/unix/io/trait.AsRawFd.html
//! [`AsRawHandle`]: https://doc.rust-lang.org/std/os/windows/io/trait.AsRawHandle.html

#![deny(missing_docs)]
#![cfg_attr(can_vector, feature(can_vector))]
#![cfg_attr(write_all_vectored, feature(write_all_vectored))]

mod borrow_streamer;
mod files;
#[cfg(feature = "io-streams")]
mod owned_streamer;
#[cfg(not(windows))]
mod posish;
mod ranges;
mod slice;
#[cfg(windows)]
mod windows;

pub use ranges::{EditAt, Metadata, Range, RangeEditor, RangeReader, RangeWriter, ReadAt, WriteAt};

/// Advice to pass to [`Range::advise`] to describe an expected access pattern.
///
/// This is a re-export of [`system_interface::fs::Advice`].
pub use system_interface::fs::Advice;

/// Functions for custom implementations of `ReadAt` and `WriteAt` for
/// file-like types.
pub mod filelike {
    // We can't use Windows' `read_at` or `write_at` here because it isn't able to
    // extend the length of a file we can't `reopen` (such as temporary files).
    // However, while `FileIoExt` can't use `seek_write` because it mutates the
    // current position, here we *can* use plain `seek_write` because `RangeEditor`
    // doesn't expose the current position.
    pub use crate::files::{advise, copy_from, set_len};
    #[cfg(all(not(windows), feature = "io-streams"))]
    pub use crate::posish::read_via_stream_at;
    #[cfg(not(windows))]
    pub use crate::posish::{
        is_read_vectored_at, is_write_vectored_at, metadata, read_at, read_exact_at,
        read_exact_vectored_at, read_vectored_at, write_all_at, write_all_vectored_at, write_at,
        write_vectored_at,
    };
    #[cfg(all(windows, feature = "io-streams"))]
    pub use crate::windows::read_via_stream_at;
    #[cfg(windows)]
    pub use crate::windows::{
        is_read_vectored_at, is_write_vectored_at, metadata, read_at, read_exact_at,
        read_exact_vectored_at, read_vectored_at, write_all_at, write_all_vectored_at, write_at,
        write_vectored_at,
    };
}