compat/terminal: separate input and output handles
authorErik Faye-Lund <kusmabite@gmail.com>
Tue, 4 Dec 2012 08:10:40 +0000 (09:10 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 4 Dec 2012 16:02:55 +0000 (08:02 -0800)
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>
compat/terminal.c

index a6212ca3c988ca0e3ee71c397a79144e6b482fe8..9aecad68a04817efc4410846a8bcb58c262765d4 100644 (file)
@@ -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;