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>
maint
Erik Faye-Lund 2012-12-04 09:10:40 +01:00 committed by Junio C Hamano
parent 9df92e6369
commit 67fe735653
1 changed files with 19 additions and 12 deletions

View File

@ -50,29 +50,36 @@ char *git_terminal_prompt(const char *prompt, int echo)
{ {
static struct strbuf buf = STRBUF_INIT; static struct strbuf buf = STRBUF_INIT;
int r; int r;
FILE *fh; FILE *input_fh, *output_fh;


fh = fopen("/dev/tty", "w+"); input_fh = fopen("/dev/tty", "r");
if (!fh) if (!input_fh)
return NULL; return NULL;


if (!echo && disable_echo()) { output_fh = fopen("/dev/tty", "w");
fclose(fh); if (!output_fh) {
fclose(input_fh);
return NULL; return NULL;
} }


fputs(prompt, fh); if (!echo && disable_echo()) {
fflush(fh); fclose(input_fh);
fclose(output_fh);
return NULL;
}


r = strbuf_getline(&buf, fh, '\n'); fputs(prompt, output_fh);
fflush(output_fh);

r = strbuf_getline(&buf, input_fh, '\n');
if (!echo) { if (!echo) {
fseek(fh, SEEK_CUR, 0); putc('\n', output_fh);
putc('\n', fh); fflush(output_fh);
fflush(fh);
} }


restore_term(); restore_term();
fclose(fh); fclose(input_fh);
fclose(output_fh);


if (r == EOF) if (r == EOF)
return NULL; return NULL;