diff --git a/bin/drk/src/interactive.rs b/bin/drk/src/interactive.rs index 72d2642ae..14c757b6c 100644 --- a/bin/drk/src/interactive.rs +++ b/bin/drk/src/interactive.rs @@ -678,27 +678,55 @@ async fn listen_for_line( _ = input_future.fuse() => break, // Manage filled channel _ = channel_future.fuse() => { - while !shell_receiver.is_empty() { - match shell_receiver.recv().await { - Ok(msg) => { - // We only print if snooze is inactive, - // but have to consume the message regardless, - // so the queue gets empty. - if *snooze_active { - continue - } - // Hide prompt, print output, show prompt again - let _ = state.hide(); - for line in msg { - println!("{}\r", line.replace("\n", "\n\r")); - } - let _ = state.show(); - } - Err(e) => { + // We only print if snooze is inactive, + // but have to consume the message regardless, + // so the queue gets empty. + if *snooze_active { + while !shell_receiver.is_empty() { + if let Err(e) = shell_receiver.recv().await { eprintln!("Error while reading shell receiver channel: {e}"); break } } + } else { + // Hide prompt + if let Err(e) = state.hide() { + eprintln!("Error while hiding linenoise state: {e}"); + break + }; + + // Restore blocking mode + unsafe { + let flags = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, flags & !O_NONBLOCK); + } + + // Print output + while !shell_receiver.is_empty() { + match shell_receiver.recv().await { + Ok(msg) => { + for line in msg { + println!("{}\r", line.replace("\n", "\n\r")); + } + } + Err(e) => { + eprintln!("Error while reading shell receiver channel: {e}"); + break + } + } + } + + // Set stdin to non-blocking mode + unsafe { + let flags = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, flags | O_NONBLOCK); + } + + // Show prompt again + if let Err(e) = state.show() { + eprintln!("Error while showing linenoise state: {e}"); + break + }; } } } @@ -710,7 +738,9 @@ async fn listen_for_line( fcntl(fd, F_SETFL, flags & !O_NONBLOCK); } - let _ = state.edit_stop(); + if let Err(e) = state.edit_stop() { + eprintln!("Error while stopping linenoise state: {e}"); + }; line }