diff options
author | Rory Dudley | 2024-02-29 01:40:27 -0700 |
---|---|---|
committer | Rory Dudley | 2024-02-29 01:40:27 -0700 |
commit | 718f45492a4b2c31a67458c13c4cd4b3268703bc (patch) | |
tree | d577bc14368319adac8bf24e0a757b5eccd24df8 /src/recite/ps.rs | |
parent | 2be80340afbc457f22f8c4cc441ef572b0acfda1 (diff) | |
download | dwarvish-718f45492a4b2c31a67458c13c4cd4b3268703bc.tar.gz |
Fix handling of SIGINT
Keep track of a new atomic variable: at_prompt, which is set to true
just before blocking on io::stdin.read_line, and set to false just
calling Poem::read. Additionally, for background tasks, there is a new
ps macro called btask, which changes the process group of commands that
are forked into the background, so that they don't receive SIGINT from
the keyboard.
Notes
Notes:
Changing the process group on the Command is done via CommandExt. More
details here:
https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.process_group
Diffstat (limited to 'src/recite/ps.rs')
-rw-r--r-- | src/recite/ps.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/recite/ps.rs b/src/recite/ps.rs index d0e2435..bb18b3f 100644 --- a/src/recite/ps.rs +++ b/src/recite/ps.rs @@ -60,3 +60,36 @@ macro_rules! ctask { } }; } + +#[macro_export] +/// Fork into a background process from a Verse +/// +/// Figures out whether or not the given Verse is a couplet. If it is, fork +/// into a backgournd process, and pipe the contents of out `out` into STDIN. +/// If not, then simply fork into the background process. +/// +/// # Arguments +/// * `$verse: &Verse` - The verse to fork into +/// * `$out: &mut String` - If the $verse is a couplet, the contents of STDOUT from the last verse +macro_rules! btask { + ($verse:expr, $out:expr) => { + if $verse.couplet { + let mut child = Command::new($verse.verb()) + .args($verse.clause()) + .stdin(Stdio::piped()) + .process_group(0) + .spawn()?; + + let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?; + stdin.write_all(&$out.as_bytes())?; + $out.clear(); + + child + } else { + Command::new($verse.verb()) + .args($verse.clause()) + .process_group(0) + .spawn()? + } + }; +} |