From: Erik Faye-Lund Date: Tue, 4 Dec 2012 08:10:40 +0000 (+0100) Subject: compat/terminal: separate input and output handles X-Git-Tag: v1.8.1-rc2~9^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67fe7356538c714da9da6061abe99209452260d7;p=git 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 Signed-off-by: Junio C Hamano --- 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;