client: Factor set_echo_if_tty() out of get_password()
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 27 Dec 2020 10:32:48 +0000 (11:32 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sat, 23 Jan 2021 06:08:03 +0000 (07:08 +0100)
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
src/client/getpass.c

index 517e37740bf27ba6370015de44f8cdca433dab8f..6e151f41e023551d748cbeb7ccb13df7862f41d5 100644 (file)
 #endif
 #include "misc.h"
 
+#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)
 {
@@ -51,22 +76,19 @@ get_password(const char *prompt)
     static char buf[128];
     char *p;
     size_t len;
-#ifdef _WIN32
-    DWORD mode;
-    HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
+    int echo_set;
 
-    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("%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);