diff --git a/Cargo.lock b/Cargo.lock index 05b771b22..6ffe17df1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -485,15 +485,6 @@ dependencies = [ "generic-array 0.14.9", ] -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - [[package]] name = "blocking" version = "1.6.2" @@ -942,17 +933,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctrlc" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" -dependencies = [ - "dispatch2", - "nix", - "windows-sys 0.61.2", -] - [[package]] name = "cxx" version = "1.0.187" @@ -1201,18 +1181,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags", - "block2", - "libc", - "objc2", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -2807,15 +2775,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -dependencies = [ - "objc2-encode", -] - [[package]] name = "objc2-core-foundation" version = "0.3.2" @@ -2825,12 +2784,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - [[package]] name = "objc2-io-kit" version = "0.3.2" @@ -2857,7 +2810,6 @@ dependencies = [ "clap_lex", "clap_mangen", "console-subscriber", - "ctrlc", "debversion", "dialoguer", "dirs", @@ -2892,6 +2844,7 @@ dependencies = [ "serde", "serde_json", "sha2", + "signal-hook", "strsim", "sysinfo", "tabled", diff --git a/Cargo.toml b/Cargo.toml index 3be064bcd..79eff22ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ authors = ["eatradish "] # Cli clap = { version = "4.5.19", features = ["cargo", "wrap_help", "color", "derive", "env", "string"] } anyhow = "1.0.89" -ctrlc = "3.5" dialoguer = "0.12.0" tabled = { version = "0.20", features = ["ansi"] } tokio = "1.46.0" @@ -52,6 +51,7 @@ once_cell = "1.21" itertools = "0.14.0" clap-i18n-richformatter = "0.1.0" debversion = "0.5" +signal-hook = "0.3.18" # oma crates oma-utils = { path = "./oma-utils", features = ["dbus", "human-bytes"] } diff --git a/src/main.rs b/src/main.rs index 61aff1e40..5b3b1ae85 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,26 +1,7 @@ -use std::env::{self, args}; -use std::ffi::CString; -use std::fs::{create_dir_all, read_dir, remove_file}; -use std::io::{self, IsTerminal, stderr, stdin}; -use std::path::{Path, PathBuf}; - -use std::process::{Command, exit}; -use std::sync::{LazyLock, OnceLock}; -use std::thread; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; - -mod args; -mod config; -mod error; -mod install_progress; -mod lang; -mod path_completions; -mod pb; -mod subcommand; -mod table; -mod tui; -mod utils; - +use crate::config::Config; +use crate::error::Chain; +use crate::install_progress::osc94_progress; +use crate::subcommand::*; use args::{CliExecuter, OhManagerAilurus}; use clap::builder::FalseyValueParser; use clap::{ArgAction, ArgMatches, Args, ColorChoice, CommandFactory, FromArgMatches, arg}; @@ -29,14 +10,27 @@ use clap_i18n_richformatter::{ClapI18nRichFormatter, init_clap_rich_formatter_lo use error::OutputError; use i18n_embed::{DesktopLanguageRequester, Localizer}; use lang::LANGUAGE_LOADER; +use libc::{SIGHUP, SIGQUIT}; use oma_console::OmaLayer; +use oma_console::console; use oma_console::print::{OmaColorFormat, termbg}; use oma_console::writer::{MessageType, Writer, writeln_inner}; use oma_pm::apt::AptConfig; use oma_utils::dbus::{create_dbus_connection, get_another_oma_status}; use oma_utils::{OsRelease, is_termux}; use reqwest::Client; -use rustix::stdio::stdout; +use signal_hook::consts::{SIGINT, SIGTERM}; +use signal_hook::iterator::Signals; +use std::env::{self, args}; +use std::ffi::CString; +use std::fs::{create_dir_all, read_dir, remove_file}; +use std::io::{self, IsTerminal, stderr, stdin, stdout}; +use std::path::{Path, PathBuf}; +use std::process::{Command, exit}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{LazyLock, OnceLock}; +use std::thread; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; use subcommand::utils::{LockError, is_terminal}; use tokio::runtime::Runtime; use tracing::{debug, error, info, warn}; @@ -47,14 +41,17 @@ use tracing_subscriber::{EnvFilter, Layer, fmt}; use tui::Tui; use utils::{is_root, is_ssh_from_loginctl}; -use std::sync::atomic::{AtomicBool, Ordering}; - -use oma_console::console; - -use crate::config::Config; -use crate::error::Chain; -use crate::install_progress::osc94_progress; -use crate::subcommand::*; +mod args; +mod config; +mod error; +mod install_progress; +mod lang; +mod path_completions; +mod pb; +mod subcommand; +mod table; +mod tui; +mod utils; static NOT_DISPLAY_ABORT: AtomicBool = AtomicBool::new(false); static LOCKED: AtomicBool = AtomicBool::new(false); @@ -172,7 +169,15 @@ fn main() { .completer("oma") .complete(); - ctrlc::set_handler(signal_handler).expect("oma could not initialize SIGINT handler."); + thread::spawn(|| { + let mut sigs = + Signals::new([SIGTERM, SIGINT, SIGHUP, SIGQUIT]).expect("Failed to set signal handler"); + + for signal in &mut sigs { + signal_handler(signal == SIGINT); + std::process::exit(128 + signal); + } + }); // 要适配额外的插件子命令,所以这里要保留 matches let (matches, oma) = parse_args(); @@ -681,8 +686,8 @@ fn sysroot_default_value() -> &'static str { } } -fn signal_handler() { - if NOT_ALLOW_CTRLC.load(Ordering::Relaxed) { +fn signal_handler(is_ctrlc: bool) { + if is_ctrlc && NOT_ALLOW_CTRLC.load(Ordering::Relaxed) { return; } @@ -703,6 +708,4 @@ fn signal_handler() { if !not_display_abort { info!("{}", fl!("user-aborted-op")); } - - std::process::exit(130); }