Factor out the opening and closing of /dev/tty from git_terminal_prompt(), so that callers may first test if a controlling terminal is available before proceeding with prompting proper. When HAVE_DEV_TTY is not defined, terminal_open() falls back to checking tty-ness of stdin and stderr, as getpass() uses them both. Signed-off-by: Tay Ray Chuan <rctay89@xxxxxxxxx> --- compat/terminal.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- compat/terminal.h | 10 ++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/compat/terminal.c b/compat/terminal.c index 6d16c8f..c85d5c7 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -24,15 +24,21 @@ static void restore_term_on_signal(int sig) raise(sig); } -char *git_terminal_prompt(const char *prompt, int echo) +term_t terminal_open(void) +{ + return fopen("/dev/tty", "w+"); +} + +int terminal_close(term_t term) +{ + return fclose(term); +} + +char *terminal_prompt(term_t term, const char *prompt, int echo) { static struct strbuf buf = STRBUF_INIT; int r; - FILE *fh; - - fh = fopen("/dev/tty", "w+"); - if (!fh) - return NULL; + FILE *fh = term; if (!echo) { struct termios t; @@ -64,18 +70,48 @@ char *git_terminal_prompt(const char *prompt, int echo) } restore_term(); - fclose(fh); if (r == EOF) return NULL; return buf.buf; } +char *git_terminal_prompt(const char *prompt, int echo) +{ + char *ret; + term_t term; + + term = terminal_open(); + if (!term) + return NULL; + + ret = terminal_prompt(term, prompt, echo); + + terminal_close(term); + + return ret; +} + #else -char *git_terminal_prompt(const char *prompt, int echo) +term_t terminal_open() +{ + return isatty(0) && isatty(2); +} + +int terminal_close(term_t term) +{ + return 0; +} + +char *terminal_prompt(term_t term, const char *prompt, int echo) { return getpass(prompt); } +char *git_terminal_prompt(const char *prompt, int echo) +{ + return terminal_prompt(prompt, echo); +} + #endif diff --git a/compat/terminal.h b/compat/terminal.h index 97db7cd..cf2aa10 100644 --- a/compat/terminal.h +++ b/compat/terminal.h @@ -1,6 +1,16 @@ #ifndef COMPAT_TERMINAL_H #define COMPAT_TERMINAL_H +#ifdef HAVE_DEV_TTY +typedef FILE *term_t; +#else +typedef int term_t; +#endif + +term_t terminal_open(); +int terminal_close(term_t term); +char *terminal_prompt(term_t term, const char *prompt, int echo); + char *git_terminal_prompt(const char *prompt, int echo); #endif /* COMPAT_TERMINAL_H */ -- 1.7.12.rc1.187.g6dd9156 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html