From 07c802b93a241d566161d3077b3254df4067fa1e Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Thu, 5 Mar 2026 17:37:52 +0100 Subject: lots of shenanigans to have proper execve reload --- src/main.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 81cc5d3..6687937 100644 --- a/src/main.rs +++ b/src/main.rs @@ -248,6 +248,35 @@ fn event_loop() { se.raw.disable(); } +#[cfg(debug_assertions)] +fn reload_shell() { + use std::{env, ffi::CString, ptr}; + + // path to this executable + let exe = env::current_exe().unwrap(); + let exe_c = CString::new(exe.as_os_str().as_bytes()).unwrap(); + + // argv + let args: Vec = env::args().map(|a| CString::new(a).unwrap()).collect(); + + let mut argv: Vec<*const libc::c_char> = args.iter().map(|a| a.as_ptr()).collect(); + argv.push(ptr::null()); + + // environment + let env: Vec = env::vars() + .map(|(k, v)| CString::new(format!("{}={}", k, v)).unwrap()) + .collect(); + + let mut envp: Vec<*const libc::c_char> = env.iter().map(|e| e.as_ptr()).collect(); + envp.push(ptr::null()); + + unsafe { + libc::execve(exe_c.as_ptr(), argv.as_ptr(), envp.as_ptr()); + } + + eprintln!("exec failed"); +} + fn main() { if !io::stdin().is_terminal() { println!("need to run in a tty"); @@ -261,7 +290,14 @@ fn main() { let res = std::panic::catch_unwind(event_loop); match res { Ok(_) => break, - Err(_) => continue, + Err(_) => + { + #[cfg(debug_assertions)] + if run::RELOAD.load(std::sync::atomic::Ordering::SeqCst) { + reload_shell(); + println!("failed to reload shell"); + } + } } } -- cgit v1.2.3