git/compat/terminal.h
Phillip Wood e4938ce3cc terminal: don't assume stdin is /dev/tty
read_key_without_echo() reads from stdin but uses /dev/tty when it
disables echo. This is unfortunate as there no guarantee that stdin is
the same device as /dev/tty. The perl version of "add -p" uses stdin
when it sets the terminal mode, this commit does the same for the
builtin version. There is still a difference between the perl and
builtin versions though - the perl version will ignore any errors when
setting the terminal mode[1] and will still read single bytes when
stdin is not a terminal. The builtin version displays a warning if
setting the terminal mode fails and switches to reading a line at a
time.

[1] b061c913bb/ReadKey.xs (L1090)

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-03-16 12:24:43 -07:00

28 lines
875 B
C

#ifndef COMPAT_TERMINAL_H
#define COMPAT_TERMINAL_H
enum save_term_flags {
/* Save input and output settings */
SAVE_TERM_DUPLEX = 1 << 0,
/* Save stdin rather than /dev/tty (fails if stdin is not a terminal) */
SAVE_TERM_STDIN = 1 << 1,
};
/*
* Save the terminal attributes so they can be restored later by a
* call to restore_term(). Note that every successful call to
* save_term() must be matched by a call to restore_term() even if the
* attributes have not been changed. Returns 0 on success, -1 on
* failure.
*/
int save_term(enum save_term_flags flags);
/* Restore the terminal attributes that were saved with save_term() */
void restore_term(void);
char *git_terminal_prompt(const char *prompt, int echo);
/* Read a single keystroke, without echoing it to the terminal */
int read_key_without_echo(struct strbuf *buf);
#endif /* COMPAT_TERMINAL_H */