use std::fs::OpenOptions;
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering};
use tracing_appender::non_blocking::WorkerGuard;
use crate::{AutosshError, CompatibilityMode};
static FALLBACK_WARNED: AtomicBool = AtomicBool::new(false);
pub fn init_logfile(
path: Option<PathBuf>,
mode: CompatibilityMode,
) -> Result<Option<WorkerGuard>, AutosshError> {
let Some(p) = path else {
return Ok(None);
};
let file = OpenOptions::new().create(true).append(true).open(&p);
let file = match file {
Ok(f) => f,
Err(_) => {
fallback_to_stderr(&p);
return Ok(None);
}
};
match mode {
CompatibilityMode::Default => {
let (_writer, guard) = tracing_appender::non_blocking(file);
Ok(Some(guard))
}
CompatibilityMode::Strict => {
drop(file);
Ok(None)
}
}
}
pub fn fallback_to_stderr(path: &Path) {
if FALLBACK_WARNED.swap(true, Ordering::SeqCst) {
return;
}
eprintln!(
"rusty-autossh: log file {} is not writable; falling back to stderr",
path.display()
);
}