#![deny(unsafe_code)]
mod launcher_payload;
use std::ffi::OsString;
use std::fs::File;
use std::os::windows::ffi::OsStringExt as _;
use std::path::PathBuf;
use std::process::Command;
#[allow(unsafe_code)]
mod console {
#[link(name = "kernel32")]
unsafe extern "system" {
fn SetConsoleCtrlHandler(handler: Option<extern "system" fn(u32) -> i32>, add: i32) -> i32;
}
extern "system" fn handle(event: u32) -> i32 {
i32::from(event == 0 || event == 1)
}
pub fn install() -> std::io::Result<()> {
if unsafe { SetConsoleCtrlHandler(Some(handle), 1) } == 0 {
Err(std::io::Error::last_os_error())
} else {
Ok(())
}
}
}
fn run() -> std::io::Result<i32> {
console::install()?;
let mut executable = File::open(std::env::current_exe()?)?;
let target = PathBuf::from(OsString::from_wide(&launcher_payload::read(
&mut executable,
)?));
if !target.is_absolute() {
return Err(std::io::Error::other("launcher target must be absolute"));
}
let status = Command::new(target)
.args(std::env::args_os().skip(1))
.status()?;
Ok(status.code().unwrap_or(1))
}
fn main() {
match run() {
Ok(code) => std::process::exit(code),
Err(error) => {
eprintln!("packslip launcher: {error}");
std::process::exit(126);
}
}
}