Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
+#ifndef HAVE_GETPASS
+static int
+set_echo_if_tty(int on)
+{
+#ifdef _WIN32
+ DWORD mode;
+ HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
+
+ if (!GetConsoleMode(input_handle, &mode))
+ return 0;
+
+ if (on)
+ mode |= ENABLE_ECHO_INPUT;
+ else
+ mode &= ~ENABLE_ECHO_INPUT;
+
+ if (!SetConsoleMode(input_handle, mode))
+ return -1;
+ return 1;
+#else
+ return 0;
+#endif
+}
+#endif /* !HAVE_GETPASS */
+
char *
get_password(const char *prompt)
{
char *
get_password(const char *prompt)
{
static char buf[128];
char *p;
size_t len;
static char buf[128];
char *p;
size_t len;
-#ifdef _WIN32
- DWORD mode;
- HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
- if (GetConsoleMode(input_handle, &mode))
- SetConsoleMode(input_handle, mode & ~ENABLE_ECHO_INPUT);
- else
-#endif
+ echo_set = set_echo_if_tty(0);
+ if (echo_set <= 0)
printf("Note: your input is echoed to the screen\n");
printf("Note: your input is echoed to the screen\n");
printf("%s", prompt);
fflush(stdout);
p = fgets(buf, sizeof(buf), stdin);
printf("%s", prompt);
fflush(stdout);
p = fgets(buf, sizeof(buf), stdin);
-#ifdef _WIN32
- if (GetConsoleMode(input_handle, &mode))
- SetConsoleMode(input_handle, mode | ENABLE_ECHO_INPUT);
-#endif
+
+ if (echo_set > 0)
+ set_echo_if_tty(1);
+
if (!p)
return NULL;
len = strlen(p);
if (!p)
return NULL;
len = strlen(p);