diff options
author | Erik Faye-Lund <kusmabite@gmail.com> | 2012-12-04 09:10:40 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-12-04 08:02:55 -0800 |
commit | 67fe7356538c714da9da6061abe99209452260d7 (patch) | |
tree | 74a0af6ba25cbf240653f8a72cc77348f12b337b /compat/terminal.c | |
parent | compat/terminal: factor out echo-disabling (diff) | |
download | tgif-67fe7356538c714da9da6061abe99209452260d7.tar.xz |
compat/terminal: separate input and output handles
On Windows, the terminal cannot be opened in read-write mode, so
we need distinct pairs for reading and writing. Since this works
fine on other platforms as well, always open them in pairs.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat/terminal.c')
-rw-r--r-- | compat/terminal.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/compat/terminal.c b/compat/terminal.c index a6212ca3c9..9aecad68a0 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -50,29 +50,36 @@ char *git_terminal_prompt(const char *prompt, int echo) { static struct strbuf buf = STRBUF_INIT; int r; - FILE *fh; + FILE *input_fh, *output_fh; - fh = fopen("/dev/tty", "w+"); - if (!fh) + input_fh = fopen("/dev/tty", "r"); + if (!input_fh) return NULL; + output_fh = fopen("/dev/tty", "w"); + if (!output_fh) { + fclose(input_fh); + return NULL; + } + if (!echo && disable_echo()) { - fclose(fh); + fclose(input_fh); + fclose(output_fh); return NULL; } - fputs(prompt, fh); - fflush(fh); + fputs(prompt, output_fh); + fflush(output_fh); - r = strbuf_getline(&buf, fh, '\n'); + r = strbuf_getline(&buf, input_fh, '\n'); if (!echo) { - fseek(fh, SEEK_CUR, 0); - putc('\n', fh); - fflush(fh); + putc('\n', output_fh); + fflush(output_fh); } restore_term(); - fclose(fh); + fclose(input_fh); + fclose(output_fh); if (r == EOF) return NULL; |