From: Martin Willi Date: Thu, 20 Feb 2014 10:30:17 +0000 (+0100) Subject: windows: Provide a getpass() implementation X-Git-Tag: 5.2.0dr6~24^2~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41bb8ba5d2b47ae6b7f968610fc0b56a3f00a992;p=thirdparty%2Fstrongswan.git windows: Provide a getpass() implementation --- diff --git a/src/libstrongswan/utils/windows.c b/src/libstrongswan/utils/windows.c index 492821d53d..c0ae3d87a2 100644 --- a/src/libstrongswan/utils/windows.c +++ b/src/libstrongswan/utils/windows.c @@ -250,6 +250,65 @@ int socketpair(int domain, int type, int protocol, int sv[2]) return -1; } +/** + * See header + */ +char* getpass(const char *prompt) +{ + static char buf[64] = ""; + char *pos; + HANDLE in, out; + DWORD mode, written = 0, total, done; + + out = GetStdHandle(STD_OUTPUT_HANDLE); + in = GetStdHandle(STD_INPUT_HANDLE); + + if (out == INVALID_HANDLE_VALUE || in == INVALID_HANDLE_VALUE || + !GetConsoleMode(out, &mode) || !GetConsoleMode(in, &mode)) + { + return NULL; + } + + total = strlen(prompt); + while (written < total) + { + if (!WriteConsole(out, prompt + written, total - written, &done, NULL)) + { + return NULL; + } + written += done; + } + + if (!SetConsoleMode(in, mode & ~ENABLE_ECHO_INPUT)) + { + return NULL; + } + + while (TRUE) + { + if (!ReadConsole(in, buf, sizeof(buf), &done, NULL)) + { + SetConsoleMode(in, mode); + return NULL; + } + if (done) + { + pos = strchr(buf, '\r'); + if (pos) + { + *pos = '\0'; + } + break; + } + } + SetConsoleMode(in, mode); + + /* append a newline, as we have no echo during input */ + WriteConsole(out, "\r\n", 2, &done, NULL); + + return buf; +} + /** * Set errno for a function setting WSA error on failure */ diff --git a/src/libstrongswan/utils/windows.h b/src/libstrongswan/utils/windows.h index 235586c537..c93f3fd7d3 100644 --- a/src/libstrongswan/utils/windows.h +++ b/src/libstrongswan/utils/windows.h @@ -254,6 +254,12 @@ int dlclose(void *handle); */ int socketpair(int domain, int type, int protocol, int sv[2]); +/** + * getpass(3) on Windows consoles + */ +char* getpass(const char *prompt); +#define HAVE_GETPASS + /** * Map MSG_DONTWAIT to the reserved, but deprecated MSG_INTERRUPT */