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

@@ -35,6 +35,12 @@ pub struct Args {
// ArgAction::SetFalse by default evaluates to true,
// ArgAction::SetTrue by default evaluates to false.
/// Upon encountering a read error, reopen the source file before continuing.
#[arg(short, long, action=ArgAction::SetTrue)]
#[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()))
}