compat/terminal: support echoing on windows
authorErik Faye-Lund <kusmabite@gmail.com>
Sun, 24 Jun 2012 13:23:19 +0000 (24 15:23 +0200)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Mon, 22 Oct 2012 12:31:42 +0000 (22 13:31 +0100)
Without /dev/tty support, git_terminal_prompt simply ignores the
'echo'-parameter. On Windows we can do better by clevering up our
getpass-implementation a bit so it can conditionally echo.

While we're at it, plug a small memory-leak by returning a pointer
to a static strbuf instead of detaching it. This is the same thing
the /dev/tty-version of git_terminal_prompt does, and the callee
doesn't expect to have to free it's memory.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
compat/mingw.c
compat/mingw.h
compat/terminal.c

index e6d15a4..ecbfa6e 100644 (file)
@@ -1850,21 +1850,6 @@ int link(const char *oldpath, const char *newpath)
        return 0;
 }
 
-char *getpass(const char *prompt)
-{
-       struct strbuf buf = STRBUF_INIT;
-
-       fputs(prompt, stderr);
-       for (;;) {
-               char c = _getch();
-               if (c == '\r' || c == '\n')
-                       break;
-               strbuf_addch(&buf, c);
-       }
-       fputs("\n", stderr);
-       return strbuf_detach(&buf, NULL);
-}
-
 pid_t waitpid(pid_t pid, int *status, int options)
 {
        HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION,
index 8c46a5c..00ef975 100644 (file)
@@ -56,8 +56,6 @@ struct passwd {
        char *pw_dir;
 };
 
-extern char *getpass(const char *prompt);
-
 typedef void (__cdecl *sig_handler_t)(int);
 struct sigaction {
        sig_handler_t sa_handler;
index bbb038d..8e91f33 100644 (file)
@@ -72,6 +72,26 @@ char *git_terminal_prompt(const char *prompt, int echo)
        return buf.buf;
 }
 
+#elif defined(WIN32)
+
+char *git_terminal_prompt(const char *prompt, int echo)
+{
+       static struct strbuf buf = STRBUF_INIT;
+
+       fputs(prompt, stderr);
+       strbuf_reset(&buf);
+       for (;;) {
+               int c = _getch();
+               if (c == '\n' || c == '\r')
+                       break;
+               if (echo)
+                       putc(c, stderr);
+               strbuf_addch(&buf, c);
+       }
+       putc('\n', stderr);
+       return buf.buf;
+}
+
 #else
 
 char *git_terminal_prompt(const char *prompt, int echo)