diff -Naur fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/builtins/fg.rs fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/builtins/fg.rs
--- fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/builtins/fg.rs 2026-02-01 04:13:13.000000000 -0500
+++ fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/builtins/fg.rs 2026-02-01 03:58:51.000000000 -0500
@@ -6,9 +6,7 @@
use crate::tokenizer::tok_command;
use crate::wutil::perror;
use crate::{env::EnvMode, tty_handoff::TtyHandoff};
-use libc::STDIN_FILENO;
-use nix::sys::termios::{self, tcsetattr};
-use std::os::fd::BorrowedFd;
+use libc::{STDIN_FILENO, TCSADRAIN};
use super::prelude::*;
@@ -144,14 +142,9 @@
}
let tmodes = job_group.tmodes.borrow();
if job_group.wants_terminal() && tmodes.is_some() {
- let tmodes = tmodes.as_ref().unwrap();
- if tcsetattr(
- unsafe { BorrowedFd::borrow_raw(STDIN_FILENO) },
- termios::SetArg::TCSADRAIN,
- tmodes,
- )
- .is_err()
- {
+ let termios = tmodes.as_ref().unwrap();
+ let res = unsafe { libc::tcsetattr(STDIN_FILENO, TCSADRAIN, termios) };
+ if res < 0 {
perror("tcsetattr");
}
}
diff -Naur fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/builtins/fish_key_reader.rs fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/builtins/fish_key_reader.rs
--- fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/builtins/fish_key_reader.rs 2026-02-01 04:13:13.000000000 -0500
+++ fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/builtins/fish_key_reader.rs 2026-02-01 03:58:51.000000000 -0500
@@ -47,7 +47,7 @@
for evt in [VINTR, VEOF] {
let modes = shell_modes();
- let cc = Key::from_single_byte(modes.control_chars[evt]);
+ let cc = Key::from_single_byte(modes.c_cc[evt]);
if match_key_event_to_key(&key_evt, &cc).is_some() {
if recent_keys
@@ -61,7 +61,7 @@
}
streams.err.appendln(&wgettext_fmt!(
"Press ctrl-%c again to exit",
- char::from(modes.control_chars[evt] + 0x60)
+ char::from(modes.c_cc[evt] + 0x60)
));
return false;
}
@@ -162,8 +162,8 @@
let modes = shell_modes();
streams.err.appendln(&wgettext_fmt!(
"or press ctrl-%c or ctrl-%c twice in a row.",
- char::from(modes.control_chars[VINTR] + 0x60),
- char::from(modes.control_chars[VEOF] + 0x60)
+ char::from(modes.c_cc[VINTR] + 0x60),
+ char::from(modes.c_cc[VEOF] + 0x60)
));
streams.err.appendln(L!("\n"));
}
diff -Naur fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/common.rs fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/common.rs
--- fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/common.rs 2026-02-01 04:13:13.000000000 -0500
+++ fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/common.rs 2026-02-01 03:58:51.000000000 -0500
@@ -19,7 +19,6 @@
use fish_widestring::{
ENCODE_DIRECT_END, decode_byte_from_char, encode_byte_to_char, subslice_position,
};
-use nix::sys::termios::Termios;
use std::env;
use std::ffi::{CStr, CString, OsStr, OsString};
use std::os::unix::prelude::*;
@@ -885,7 +884,7 @@
Some(in_pos)
}
-pub fn shell_modes() -> MutexGuard<'static, Termios> {
+pub fn shell_modes() -> MutexGuard<'static, libc::termios> {
crate::reader::SHELL_MODES.lock().unwrap()
}
diff -Naur fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/input_common.rs fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/input_common.rs
--- fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/input_common.rs 2026-02-01 04:13:13.000000000 -0500
+++ fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/input_common.rs 2026-02-01 03:58:51.000000000 -0500
@@ -878,7 +878,7 @@
self.push_back(evt);
}
});
- let vintr = shell_modes().control_chars[libc::VINTR];
+ let vintr = shell_modes().c_cc[libc::VINTR];
if vintr != 0
&& key.is_some_and(|key| {
match_key_event_to_key(&key, &Key::from_single_byte(vintr))
@@ -1619,7 +1619,7 @@
fn select_interrupted(&mut self) {}
fn enqueue_interrupt_key(&mut self) {
- let vintr = shell_modes().control_chars[libc::VINTR];
+ let vintr = shell_modes().c_cc[libc::VINTR];
if vintr != 0 {
let interrupt_evt = CharEvent::from_key(KeyEvent::from_single_byte(vintr));
if stop_query(self.blocking_query()) {
diff -Naur fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/job_group.rs fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/job_group.rs
--- fish-shell-bb7dce941acf51b11ee49994f799ba90911872ac/src/job_group.rs 2026-02-01 04:13:13.000000000 -0500
+++ fish-shell-55e925526480e9e22d659724660ae9e484bc77fd/src/job_group.rs 2026-02-01 03:58:51.000000000 -0500
@@ -2,7 +2,6 @@
use crate::prelude::*;
use crate::proc::{JobGroupRef, Pid};
use crate::signal::Signal;
-use nix::sys::termios::Termios;
use std::cell::RefCell;
use std::num::NonZeroU32;
use std::sync::atomic::{AtomicI32, Ordering};
@@ -61,7 +60,7 @@
pub struct JobGroup {
/// If set, the saved terminal modes of this job. This needs to be saved so that we can restore
/// the terminal to the same state when resuming a stopped job.
- pub tmodes: RefCell