git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 4/6] compat/terminal: separate input and output handles

From
Erik Faye-Lund <kusmabite@gmail.com>
Date
Dec 4, 2012, 08:10 UTC
Message-ID
<1354608642-5316-5-git-send-email-kusmabite@gmail.com>
In-Reply-To
<1354608642-5316-1-git-send-email-kusmabite@gmail.com>

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>
---
 compat/terminal.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/compat/terminal.c b/compat/terminal.c
index a6212ca..9aecad6 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;
-- 
1.8.0.4.g3c6fb4f.dirty

-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en
Previous: Erik Faye-LundNext: Erik Faye-Lund
Message 5 of 7 in “win32: support echo for terminal-prompt”
  1. 0/6 win32: support echo for terminal-promptErik Faye-Lund, Dec 4, 2012
  2. 1/6 mingw: correct exit-code for SIGALRM's SIG_DFLErik Faye-Lund, Dec 4, 2012
  3. 2/6 mingw: make fgetc raise SIGINT if apropriateErik Faye-Lund, Dec 4, 2012
  4. 3/6 compat/terminal: factor out echo-disablingErik Faye-Lund, Dec 4, 2012
  5. 4/6 compat/terminal: separate input and output handlesErik Faye-Lund, Dec 4, 2012
  6. 5/6 mingw: reuse tty-version of git_terminal_promptErik Faye-Lund, Dec 4, 2012
  7. 6/6 mingw: get rid of getpass implementationErik Faye-Lund, Dec 4, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.