use pyo3::prelude::*;
use std::ffi::OsString;
use juiz_core::log;
pub fn main_with_args<I, T>(py: Python<'_>, args: I) -> i32
where
I: IntoIterator<Item = T> + Send,
T: Into<OsString> + Clone,
{
let saved = default_sigint(py);
let code = py.allow_threads(|| crate::main_with_args(args));
if let Some(handler) = saved {
restore_sigint(py, handler);
}
code
}
fn default_sigint(py: Python<'_>) -> Option<PyObject> {
let result = (|| -> PyResult<PyObject> {
let signal = py.import_bound("signal")?;
let sigint = signal.getattr("SIGINT")?;
let saved = signal.call_method1("getsignal", (&sigint,))?;
signal.call_method1("signal", (&sigint, signal.getattr("SIG_DFL")?))?;
Ok(saved.unbind())
})();
match result {
Ok(saved) => Some(saved),
Err(e) => {
log::debug!("SIGINT のハンドラを変えずに実行します: {e}");
None
}
}
}
fn restore_sigint(py: Python<'_>, handler: PyObject) {
let result = (|| -> PyResult<()> {
let signal = py.import_bound("signal")?;
signal.call_method1("signal", (signal.getattr("SIGINT")?, handler))?;
Ok(())
})();
if let Err(e) = result {
log::warn!("SIGINT のハンドラを元に戻せませんでした: {e}");
}
}