mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-16 19:58:03 +01:00
Merge pull request #616 from Pytness/add-missing-signals
Bugfix: handle SIGALRM and SIGCHLD signals. Fixes #613
This commit is contained in:
18
src/pty.rs
18
src/pty.rs
@@ -4,7 +4,7 @@ use anyhow::{bail, Result};
|
|||||||
use nix::errno::Errno;
|
use nix::errno::Errno;
|
||||||
use nix::sys::select::{select, FdSet};
|
use nix::sys::select::{select, FdSet};
|
||||||
use nix::{libc, pty, sys::signal, sys::wait, unistd, unistd::ForkResult};
|
use nix::{libc, pty, sys::signal, sys::wait, unistd, unistd::ForkResult};
|
||||||
use signal_hook::consts::{SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGWINCH};
|
use signal_hook::consts::{SIGALRM, SIGCHLD, SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGWINCH};
|
||||||
use signal_hook::SigId;
|
use signal_hook::SigId;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ffi::{CString, NulError};
|
use std::ffi::{CString, NulError};
|
||||||
@@ -84,11 +84,14 @@ fn copy<T: Tty + ?Sized, R: Recorder>(
|
|||||||
let mut input: Vec<u8> = Vec::with_capacity(BUF_SIZE);
|
let mut input: Vec<u8> = Vec::with_capacity(BUF_SIZE);
|
||||||
let mut output: Vec<u8> = Vec::with_capacity(BUF_SIZE);
|
let mut output: Vec<u8> = Vec::with_capacity(BUF_SIZE);
|
||||||
let mut master_closed = false;
|
let mut master_closed = false;
|
||||||
|
|
||||||
let sigwinch_fd = SignalFd::open(SIGWINCH)?;
|
let sigwinch_fd = SignalFd::open(SIGWINCH)?;
|
||||||
let sigint_fd = SignalFd::open(SIGINT)?;
|
let sigint_fd = SignalFd::open(SIGINT)?;
|
||||||
let sigterm_fd = SignalFd::open(SIGTERM)?;
|
let sigterm_fd = SignalFd::open(SIGTERM)?;
|
||||||
let sigquit_fd = SignalFd::open(SIGQUIT)?;
|
let sigquit_fd = SignalFd::open(SIGQUIT)?;
|
||||||
let sighup_fd = SignalFd::open(SIGHUP)?;
|
let sighup_fd = SignalFd::open(SIGHUP)?;
|
||||||
|
let sigalrm_fd = SignalFd::open(SIGALRM)?;
|
||||||
|
let sigchld_fd = SignalFd::open(SIGCHLD)?;
|
||||||
|
|
||||||
set_non_blocking(&master_raw_fd)?;
|
set_non_blocking(&master_raw_fd)?;
|
||||||
|
|
||||||
@@ -104,6 +107,8 @@ fn copy<T: Tty + ?Sized, R: Recorder>(
|
|||||||
rfds.insert(&sigterm_fd);
|
rfds.insert(&sigterm_fd);
|
||||||
rfds.insert(&sigquit_fd);
|
rfds.insert(&sigquit_fd);
|
||||||
rfds.insert(&sighup_fd);
|
rfds.insert(&sighup_fd);
|
||||||
|
rfds.insert(&sigalrm_fd);
|
||||||
|
rfds.insert(&sigchld_fd);
|
||||||
|
|
||||||
if !master_closed {
|
if !master_closed {
|
||||||
rfds.insert(&master_fd);
|
rfds.insert(&master_fd);
|
||||||
@@ -134,6 +139,8 @@ fn copy<T: Tty + ?Sized, R: Recorder>(
|
|||||||
let sigterm_read = rfds.contains(&sigterm_fd);
|
let sigterm_read = rfds.contains(&sigterm_fd);
|
||||||
let sigquit_read = rfds.contains(&sigquit_fd);
|
let sigquit_read = rfds.contains(&sigquit_fd);
|
||||||
let sighup_read = rfds.contains(&sighup_fd);
|
let sighup_read = rfds.contains(&sighup_fd);
|
||||||
|
let sigalrm_read = rfds.contains(&sigalrm_fd);
|
||||||
|
let sigchld_read = rfds.contains(&sigchld_fd);
|
||||||
|
|
||||||
if master_read {
|
if master_read {
|
||||||
while let Some(n) = read_non_blocking(&mut master, &mut buf)? {
|
while let Some(n) = read_non_blocking(&mut master, &mut buf)? {
|
||||||
@@ -220,7 +227,7 @@ fn copy<T: Tty + ?Sized, R: Recorder>(
|
|||||||
sigint_fd.flush();
|
sigint_fd.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
if sigterm_read || sigquit_read || sighup_read {
|
if sigterm_read || sigquit_read || sighup_read || sigalrm_read || sigchld_read {
|
||||||
if sigterm_read {
|
if sigterm_read {
|
||||||
sigterm_fd.flush();
|
sigterm_fd.flush();
|
||||||
}
|
}
|
||||||
@@ -233,6 +240,13 @@ fn copy<T: Tty + ?Sized, R: Recorder>(
|
|||||||
sighup_fd.flush();
|
sighup_fd.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if sigalrm_read {
|
||||||
|
sigalrm_fd.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
if sigchld_read {
|
||||||
|
sigchld_fd.flush();
|
||||||
|
}
|
||||||
unsafe { libc::kill(child.as_raw(), SIGTERM) };
|
unsafe { libc::kill(child.as_raw(), SIGTERM) };
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|||||||
Reference in New Issue
Block a user