Skip to content

Commit

Permalink
compat/terminal: factor out echo-disabling
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Erik Faye-Lund authored and Junio C Hamano committed Dec 4, 2012
1 parent 176478a commit 9df92e6
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions compat/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ static void restore_term(void)
return;

tcsetattr(term_fd, TCSAFLUSH, &old_term);
close(term_fd);
term_fd = -1;
}

Expand All @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit 9df92e6

Please sign in to comment.