fix: standardize usage of /dev/tty where possible #957
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Resolves #919
Resolves #396
Supersedes #743
Previous attempts to prefer
/dev/tty
overstdin
had issues because of problems with polling/dev/tty
on MacOS. This has been solved for a while with theuse-dev-tty
feature, so now it should be safe to prefer/dev/tty
everywhere except for the mio event reader on MacOS.This PR prioritizes the use of
/dev/tty
for both input and output by splitting thetty_fd
function intotty_fd_in
andtty_fd_out
so both can handle the appropriate fallback logic forstdin
andstdout
respectively. The only place that needs special care is the MacOS event reader whenuse-dev-tty
is not enabled.The mio event reader for MacOS has been modified to return an explicit error message when used with piped input to inform users that
use-dev-tty
is required for such use cases. The error message was previously getting swallowed, but will now be returned to the caller.Finally, the logic to read the cursor position was always writing to
stdout
, causing an error whenstdout
was not a tty. This has been changed to use the newtty_fd_out
function.This was tested on Mac, Linux, and WSL. Windows should be unaffected.