use std::io::Write as _;
use std::panic;
pub(crate) fn safe_stderr_log(line: &str) {
let mut stderr = std::io::stderr().lock();
let _ = stderr.write_all(line.as_bytes());
let _ = stderr.write_all(b"\n");
let _ = stderr.flush();
}
pub(crate) fn install_panic_hook() {
panic::set_hook(Box::new(|panic_info| {
let msg = if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
s.to_string()
} else if let Some(s) = panic_info.payload().downcast_ref::<String>() {
s.clone()
} else {
"Unknown panic".to_string()
};
if msg.contains("Broken pipe") || msg.contains("os error 32") {
safe_stderr_log("[loctree-mcp] Client disconnected (broken pipe), shutting down");
std::process::exit(0);
} else {
let location = panic_info
.location()
.map(|loc| format!(" at {}:{}:{}", loc.file(), loc.line(), loc.column()))
.unwrap_or_default();
safe_stderr_log(&format!("[loctree-mcp] Panic{}: {}", location, msg));
}
}));
}
#[cfg(unix)]
pub(crate) fn ignore_sigpipe() {
unsafe {
libc::signal(libc::SIGPIPE, libc::SIG_IGN);
}
}
#[cfg(not(unix))]
pub(crate) fn ignore_sigpipe() {
}