+static int get_password(const char *prompt, char *str, int maxlen)
+{
+ HANDLE hin, hout;
+ DWORD savemode, i;
+
+#if 0 /* this allows specifying a password some other way */
+ if (password) {
+ static int tried_once = 0;
+
+ if (tried_once) {
+ return 0;
+ } else {
+ strncpy(str, password, maxlen);
+ str[maxlen-1] = '\0';
+ tried_once = 1;
+ return 1;
+ }
+ }
+#endif
+
+ hin = GetStdHandle(STD_INPUT_HANDLE);
+ hout = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) {
+ fprintf(stderr, "Cannot get standard input/output handles");
+ return 0;
+ }
+
+ GetConsoleMode(hin, &savemode);
+ SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
+ ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
+
+ WriteFile(hout, prompt, strlen(prompt), &i, NULL);
+ ReadFile(hin, str, maxlen-1, &i, NULL);
+
+ SetConsoleMode(hin, savemode);
+
+ if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
+ str[i] = '\0';
+
+ WriteFile(hout, "\r\n", 2, &i, NULL);
+
+ return 1;
+}
+