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

[PATCH/RFC 2/5] compat/terminal: factor out echo-disabling

From
Erik Faye-Lund <kusmabite@gmail.com>
Date
Nov 13, 2012, 14:04 UTC
Message-ID
<1352815447-8824-3-git-send-email-kusmabite@gmail.com>
In-Reply-To
<1352815447-8824-1-git-send-email-kusmabite@gmail.com>

By moving the echo-disabling code to a separate function, we can implement OS-specific versions of it for non-POSIX platforms.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
 compat/terminal.c | 43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/compat/terminal.c b/compat/terminal.c
index bbb038d..3217838 100644
--- a/compat/terminal.c
+++ b/compat/terminal.c
@@ -14,6 +14,7 @@ static void restore_term(void)
 		return;
 
 	tcsetattr(term_fd, TCSAFLUSH, &old_term);
+	close(term_fd);
 	term_fd = -1;
 }
 
@@ -24,6 +25,27 @@ static void restore_term_on_signal(int sig)
 	raise(sig);
 }
 
+static int disable_echo()
+{
+	struct termios t;
+
+	term_fd = open("/dev/tty", O_RDWR);
+	if (tcgetattr(term_fd, &t) < 0)
+		goto error;
+
+	old_term = t;
+	sigchain_push_common(restore_term_on_signal);
+
+	t.c_lflag &= ~ECHO;
+	if (!tcsetattr(term_fd, TCSAFLUSH, &t))
+		return 0;
+
+error:
+	close(term_fd);
+	term_fd = -1;
+	return -1;
+}
+
 char *git_terminal_prompt(const char *prompt, int echo)
 {
 	static struct strbuf buf = STRBUF_INIT;
@@ -34,24 +56,9 @@ char *git_terminal_prompt(const char *prompt, int echo)
 	if (!fh)
 		return NULL;
 
-	if (!echo) {
-		struct termios t;
-
-		if (tcgetattr(fileno(fh), &t) < 0) {
-			fclose(fh);
-			return NULL;
-		}
-
-		old_term = t;
-		term_fd = fileno(fh);
-		sigchain_push_common(restore_term_on_signal);
-
-		t.c_lflag &= ~ECHO;
-		if (tcsetattr(fileno(fh), TCSAFLUSH, &t) < 0) {
-			term_fd = -1;
-			fclose(fh);
-			return NULL;
-		}
+	if (!echo && disable_echo()) {
+		fclose(fh);
+		return NULL;
 	}
 
 	fputs(prompt, fh);
-- 
1.8.0.7.gbeffeda

-- 
*** 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: Junio C HamanoNext: Johannes Schindelin
Message 13 of 27 in “win32: support echo for terminal-prompt”
  1. 0/5 win32: support echo for terminal-promptErik Faye-Lund, Nov 13, 2012
  2. 1/5 mingw: make fgetc raise SIGINT if apropriateErik Faye-Lund, Nov 13, 2012
  3. Johannes SchindelinNov 30, 2012
  4. Jeff KingNov 30, 2012
  5. Erik Faye-LundDec 1, 2012
  6. Jeff KingDec 1, 2012
  7. Erik Faye-LundDec 1, 2012
  8. Johannes SchindelinDec 4, 2012
  9. Erik Faye-LundDec 4, 2012
  10. Junio C HamanoDec 2, 2012
  11. Erik Faye-LundDec 3, 2012
  12. Junio C HamanoDec 4, 2012
  13. 2/5 compat/terminal: factor out echo-disablingErik Faye-Lund, Nov 13, 2012
  14. Johannes SchindelinNov 30, 2012
  15. Jeff KingNov 30, 2012
  16. Erik Faye-LundDec 1, 2012
  17. Johannes SchindelinDec 4, 2012
  18. 3/5 compat/terminal: separate input and output handlesErik Faye-Lund, Nov 13, 2012
  19. Jeff KingNov 30, 2012
  20. 4/5 mingw: reuse tty-version of git_terminal_promptErik Faye-Lund, Nov 13, 2012
  21. Johannes SchindelinNov 30, 2012
  22. Jeff KingNov 30, 2012
  23. 5/5 mingw: get rid of getpass implementationErik Faye-Lund, Nov 13, 2012
  24. Johannes SchindelinNov 30, 2012
  25. Jeff KingNov 30, 2012
  26. Erik Faye-LundNov 30, 2012
  27. Jeff KingNov 30, 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.