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>
This commit is contained in:
parent
9df92e6369
commit
67fe735653
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user