Skip to content

Commit

Permalink
compat/terminal: separate input and output handles
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Erik Faye-Lund authored and Junio C Hamano committed Dec 4, 2012
1 parent 9df92e6 commit 67fe735
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions compat/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 67fe735

Please sign in to comment.