Dunk on NT and Darwin bc they don't use O_DIRECT which causes serious

problems for this project.
This commit is contained in:
Cutieguwu
2026-01-02 01:38:36 -05:00
parent 0a0f2f52c0
commit 1e80713263
3 changed files with 30 additions and 4 deletions

View File

@@ -8,7 +8,6 @@ license = "MIT"
publish = false
[dependencies]
libc = "0.2.178"
ron = ">=0.8, <0.13"
#rust-i18n = "3.1.3"
@@ -23,3 +22,9 @@ features = ["derive"]
[dependencies.serde]
version = "1.0"
features = ["derive"]
[target.'cfg(all(unix, not(target_os = "macos")))'.dependencies]
# Yes. For one constant, this library is required.
# And yes, I spent time tracking down the first release with that constant.
# v0.2.25 is almost 9 years old as of writing this comment.
libc = "~0.2.25"

View File

@@ -37,4 +37,10 @@ pub struct Args {
/// Upon encountering a read error, reopen the source file before continuing.
#[arg(short, long, action = ArgAction::SetTrue)]
pub reopen_on_error: bool,
/// Use O_DIRECT to bypass kernel buffer when reading.
// BSD seems to support O_DIRECT, but MacOS for certain does not.
#[cfg(all(unix, not(target_os = "macos")))]
#[arg(short, long = "direct", action = ArgAction::SetFalse)]
pub direct_io: bool,
}

View File

@@ -1,6 +1,5 @@
use std::fs::{File, OpenOptions};
use std::io::{self, Seek, SeekFrom};
use std::os::unix::fs::OpenOptionsExt;
use crate::cli::CONFIG;
@@ -20,10 +19,26 @@ pub fn get_stream_length<S: Seek>(stream: &mut S) -> io::Result<u64> {
len
}
#[cfg(all(unix, not(target_os = "macos")))]
pub fn load_input() -> anyhow::Result<File> {
use std::os::unix::fs::OpenOptionsExt;
let mut options = OpenOptions::new();
options.read(true);
if CONFIG.direct_io {
options.custom_flags(libc::O_DIRECT);
}
options
.open(&CONFIG.input)
.with_context(|| format!("Failed to open input file: {}", &CONFIG.input.display()))
}
#[cfg(any(not(unix), target_os = "macos"))]
pub fn load_input() -> anyhow::Result<File> {
OpenOptions::new()
.read(true)
.custom_flags(libc::O_DIRECT)
.open(&CONFIG.input)
.with_context(|| format!("Failed to open input file: {}", &CONFIG.input.display()))
}