From cfe06a6f66c2bca038191ff407d0a42016a88e58 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Sun, 24 Jun 2012 15:23:19 +0200 Subject: [PATCH] compat/terminal: support echoing on windows 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 --- compat/mingw.c | 15 --------------- compat/mingw.h | 2 -- compat/terminal.c | 20 ++++++++++++++++++++ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index e6d15a4d40..ecbfa6e597 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -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, diff --git a/compat/mingw.h b/compat/mingw.h index 8c46a5c76b..00ef97563b 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -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; diff --git a/compat/terminal.c b/compat/terminal.c index bbb038dd01..8e91f330eb 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -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) -- 2.11.4.GIT