use nix::unistd::Pid;
use std::os::fd::BorrowedFd;
use std::os::unix::io::RawFd;
const TERMINAL_FD: RawFd = 0;
pub fn give_terminal(pgid: Pid) -> Result<(), nix::Error> {
let fd = unsafe { BorrowedFd::borrow_raw(TERMINAL_FD) };
nix::unistd::tcsetpgrp(fd, pgid)
}
pub fn take_terminal(shell_pgid: Pid) -> Result<(), nix::Error> {
let fd = unsafe { BorrowedFd::borrow_raw(TERMINAL_FD) };
nix::unistd::tcsetpgrp(fd, shell_pgid)
}
impl super::JobTable {
pub fn set_shell_tmodes(&mut self, t: nix::sys::termios::Termios) {
self.shell_tmodes = Some(t);
}
pub fn shell_tmodes(&self) -> Option<&nix::sys::termios::Termios> {
self.shell_tmodes.as_ref()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::env::jobs::JobTable;
#[test]
fn test_terminal_functions_compile() {
let _: fn(Pid) -> Result<(), nix::Error> = give_terminal;
let _: fn(Pid) -> Result<(), nix::Error> = take_terminal;
}
#[test]
fn test_job_table_shell_tmodes_defaults_none() {
let table = JobTable::default();
assert!(
table.shell_tmodes().is_none(),
"shell_tmodes should default to None on new JobTable"
);
}
#[test]
fn test_set_shell_tmodes_stores_value() {
let mut table = JobTable::default();
let zeroed: libc::termios = unsafe { std::mem::zeroed() };
let t: nix::sys::termios::Termios = zeroed.into();
table.set_shell_tmodes(t);
assert!(
table.shell_tmodes().is_some(),
"shell_tmodes should hold the value after set_shell_tmodes"
);
}
}