kinit.c: Added krb5_read_password implementation for win32 console app
authorRichard Basch <probe@mit.edu>
Thu, 13 Feb 1997 19:34:42 +0000 (19:34 +0000)
committerRichard Basch <probe@mit.edu>
Thu, 13 Feb 1997 19:34:42 +0000 (19:34 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9860 dc483132-0cff-0310-8789-dd5450dbe970

src/clients/kinit/ChangeLog
src/clients/kinit/kinit.c

index 20a24669a005e8f8c748d5021c7b66e15583c91d..6e73a858301b5c051e0d3250be387a53fe040ea0 100644 (file)
@@ -1,3 +1,7 @@
+Thu Feb 13 14:27:41 1997  Richard Basch  <basch@lehman.com>
+
+       * kinit.c: Added krb5_read_password implementation for win32 console.
+
 Sat Feb  8 15:37:39 1997  Richard Basch  <basch@lehman.com>
 
        * Makefile.in:
index 42eabf612be0e8b568c599ae0706ca1182b51904..0cf45da382abb3c7f79e9dbe7a6e3cd0b7c9d54e 100644 (file)
@@ -439,3 +439,91 @@ cleanup:
 
     return retval;
 }
+
+#ifdef _WIN32
+krb5_error_code
+krb5_read_password(
+    krb5_context       context,
+    const char         * prompt,
+    const char         * prompt2,
+    char               * password,
+    int                        * pwsize)
+{
+    HANDLE             handle;
+    DWORD              old_mode, new_mode;
+    char               *tmpstr = 0;
+    char               *ptr;
+    int                        scratchchar;
+    krb5_error_code    errcode = 0;
+
+    handle = GetStdHandle(STD_INPUT_HANDLE);
+    if (handle == INVALID_HANDLE_VALUE)
+       return ENOTTY;
+    if (!GetConsoleMode(handle, &old_mode))
+       return ENOTTY;
+
+    new_mode = old_mode;
+    new_mode |=  ( ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT );
+    new_mode &= ~( ENABLE_ECHO_INPUT );
+
+    if (!SetConsoleMode(handle, new_mode))
+       return ENOTTY;
+
+    (void) fputs(prompt, stdout);
+    (void) fflush(stdout);
+    (void) memset(password, 0, *pwsize);
+
+    if (fgets(password, *pwsize, stdin) == NULL) {
+       (void) putchar('\n');
+       errcode = KRB5_LIBOS_CANTREADPWD;
+       goto cleanup;
+    }
+    (void) putchar('\n');
+
+    if ((ptr = strchr(password, '\n')))
+       *ptr = '\0';
+    else /* need to flush */
+       do {
+           scratchchar = getchar();
+       } while (scratchchar != EOF && scratchchar != '\n');
+
+    if (prompt2) {
+       if (! (tmpstr = (char *)malloc(*pwsize))) {
+           errcode = ENOMEM;
+           goto cleanup;
+       }
+       (void) fputs(prompt2, stdout);
+       (void) fflush(stdout);
+       if (fgets(tmpstr, *pwsize, stdin) == NULL) {
+           (void) putchar('\n');
+           errcode = KRB5_LIBOS_CANTREADPWD;
+           goto cleanup;
+       }
+       (void) putchar('\n');
+
+       if ((ptr = strchr(tmpstr, '\n')))
+           *ptr = '\0';
+       else /* need to flush */
+           do {
+               scratchchar = getchar();
+           } while (scratchchar != EOF && scratchchar != '\n');
+
+       if (strncmp(password, tmpstr, *pwsize)) {
+           errcode = KRB5_LIBOS_BADPWDMATCH;
+           goto cleanup;
+       }
+    }
+
+cleanup:
+    (void) SetConsoleMode(handle, old_mode);
+    if (tmpstr) {
+       (void) memset(tmpstr, 0, *pwsize);
+       (void) free(tmpstr);
+    }
+    if (errcode)
+       (void) memset(password, 0, *pwsize);
+    else
+       *pwsize = strlen(password);
+    return errcode;
+}
+#endif