diff options
author | Erik Faye-Lund <kusmabite@gmail.com> | 2012-12-04 09:10:39 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-12-04 08:01:59 -0800 |
commit | 9df92e6369138764ce7bd44edbb307d98e9d72fd (patch) | |
tree | 0132e044dd3b9cf8e817252272d9cd3d36600207 /compat | |
parent | 176478a8bd028a3877d2be49a1e7a49386c095ce (diff) | |
download | git-9df92e6369138764ce7bd44edbb307d98e9d72fd.tar.gz |
compat/terminal: factor out echo-disabling
By moving the echo-disabling code to a separate function, we can
implement OS-specific versions of it for non-POSIX platforms.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/terminal.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/compat/terminal.c b/compat/terminal.c index bbb038dd01..a6212ca3c9 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -14,6 +14,7 @@ static void restore_term(void) return; tcsetattr(term_fd, TCSAFLUSH, &old_term); + close(term_fd); term_fd = -1; } @@ -24,6 +25,27 @@ static void restore_term_on_signal(int sig) raise(sig); } +static int disable_echo(void) +{ + struct termios t; + + term_fd = open("/dev/tty", O_RDWR); + if (tcgetattr(term_fd, &t) < 0) + goto error; + + old_term = t; + sigchain_push_common(restore_term_on_signal); + + t.c_lflag &= ~ECHO; + if (!tcsetattr(term_fd, TCSAFLUSH, &t)) + return 0; + +error: + close(term_fd); + term_fd = -1; + return -1; +} + char *git_terminal_prompt(const char *prompt, int echo) { static struct strbuf buf = STRBUF_INIT; @@ -34,24 +56,9 @@ char *git_terminal_prompt(const char *prompt, int echo) if (!fh) return NULL; - if (!echo) { - struct termios t; - - if (tcgetattr(fileno(fh), &t) < 0) { - fclose(fh); - return NULL; - } - - old_term = t; - term_fd = fileno(fh); - sigchain_push_common(restore_term_on_signal); - - t.c_lflag &= ~ECHO; - if (tcsetattr(fileno(fh), TCSAFLUSH, &t) < 0) { - term_fd = -1; - fclose(fh); - return NULL; - } + if (!echo && disable_echo()) { + fclose(fh); + return NULL; } fputs(prompt, fh); |