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 <kusmab...@gmail.com>
---
 compat/terminal.c | 43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/compat/terminal.c b/compat/terminal.c
index bbb038d..a6212ca 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);
-- 
1.8.0.4.g3c6fb4f.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to