read_passwd.c (des_read_pw_string): Don't depend on
authorTheodore Tso <tytso@mit.edu>
Fri, 9 Jun 1995 03:26:30 +0000 (03:26 +0000)
committerTheodore Tso <tytso@mit.edu>
Fri, 9 Jun 1995 03:26:30 +0000 (03:26 +0000)
krb5_read_password(); this created a circular dependency in
the libraries.  This code is now duplicated in
des_read_pw_string.

util.c (des_cblock_print_file): Fix -Wall nit.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@5991 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/des425/ChangeLog
src/lib/des425/read_passwd.c
src/lib/des425/util.c

index 730fe41245d4ad4570de96c3e7d1090616b12ab0..be5985caf0f28d34262437056ac87169872e1fcc 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun  8 23:24:20 1995    <tytso@rsx-11.mit.edu>
+
+       * read_passwd.c (des_read_pw_string): Don't depend on
+               krb5_read_password(); this created a circular dependency
+               in the libraries.  This code is now duplicated in
+               des_read_pw_string.
+
+       * util.c (des_cblock_print_file): Fix -Wall nit.
+
 Mon Jun  5 21:02:37 1995  Ezra Peisach  (epeisach@kangaroo.mit.edu)
 
        * quad_cksum: Convert longs to KRB_INT32 for 64 bit platforms.
index dd9f4965e5a1bcd0c08fcab18d27f6ac67fc96ee..3957e4affe93f65835369f530625554fe80422c5 100644 (file)
  */
 
 #include "des.h"
+#include <stdio.h>
+#include <errno.h>
+#include <signal.h>
+#include <setjmp.h>
+#ifndef ECHO_PASSWORD
+#include <termios.h>
+#endif /* ECHO_PASSWORD */
+
+static jmp_buf pwd_jump;
+
+static krb5_sigtype
+intr_routine()
+{
+    longjmp(pwd_jump, 1);
+    /*NOTREACHED*/
+}
 
-static krb5_context krb4_global_context = 0;
 
 /*** Routines ****************************************************** */
+krb5_error_code
+des_read_pw_string/*_v4_compat_crock*/(return_pwd, bufsize, prompt, prompt2)
+    char *return_pwd;
+    int bufsize;
+    char *prompt;
+    char *prompt2;
+{
+    volatile char *readin_string = 0;
+    register char *ptr;
+    int scratchchar;
+    krb5_sigtype (*ointrfunc)();
+    krb5_error_code errcode;
+#ifndef ECHO_PASSWORD
+    struct termios echo_control, save_control;
+    int fd;
+
+    /* get the file descriptor associated with stdin */
+    fd=fileno(stdin);
+
+    if (tcgetattr(fd, &echo_control) == -1)
+       return errno;
+
+    save_control = echo_control;
+    echo_control.c_lflag &= ~(ECHO|ECHONL);
+    
+    if (tcsetattr(fd, TCSANOW, &echo_control) == -1)
+       return errno;
+#endif /* ECHO_PASSWORD */
+
+    if (setjmp(pwd_jump)) {
+       errcode = KRB5_LIBOS_PWDINTR;   /* we were interrupted... */
+       goto cleanup;
+    }
+    /* save intrfunc */
+    ointrfunc = signal(SIGINT, intr_routine);
+
+    /* put out the prompt */
+    (void) fputs(prompt,stdout);
+    (void) fflush(stdout);
+    (void) memset(return_pwd, 0, bufsize);
+
+    if (fgets(return_pwd, bufsize, stdin) == NULL) {
+       (void) putchar('\n');
+       errcode = KRB5_LIBOS_CANTREADPWD;
+       goto cleanup;
+    }
+    (void) putchar('\n');
+    /* fgets always null-terminates the returned string */
+
+    /* replace newline with null */
+    if ((ptr = strchr(return_pwd, '\n')))
+       *ptr = '\0';
+    else /* flush rest of input line */
+       do {
+           scratchchar = getchar();
+       } while (scratchchar != EOF && scratchchar != '\n');
+
+    if (prompt2) {
+       /* put out the prompt */
+       (void) fputs(prompt2,stdout);
+       (void) fflush(stdout);
+       readin_string = malloc(bufsize);
+       if (!readin_string) {
+           errcode = ENOMEM;
+           goto cleanup;
+       }
+       (void) memset((char *)readin_string, 0, bufsize);
+       if (fgets((char *)readin_string, bufsize, stdin) == NULL) {
+           (void) putchar('\n');
+           errcode = KRB5_LIBOS_CANTREADPWD;
+           goto cleanup;
+       }
+       (void) putchar('\n');
+
+       if ((ptr = strchr((char *)readin_string, '\n')))
+           *ptr = '\0';
+        else /* need to flush */
+           do {
+               scratchchar = getchar();
+           } while (scratchchar != EOF && scratchchar != '\n');
+           
+       /* compare */
+       if (strncmp(return_pwd, (char *)readin_string, bufsize)) {
+           errcode = KRB5_LIBOS_BADPWDMATCH;
+           goto cleanup;
+       }
+    }
+    
+    errcode = 0;
+    
+cleanup:
+    (void) signal(SIGINT, ointrfunc);
+#ifndef ECHO_PASSWORD
+    if ((tcsetattr(fd, TCSANOW, &save_control) == -1) &&
+       errcode == 0)
+           return errno;
+#endif
+    if (readin_string) {
+           memset((char *)readin_string, 0, bufsize);
+           krb5_xfree(readin_string);
+    }
+    if (errcode)
+           memset(return_pwd, 0, bufsize);
+    return errcode;
+}
+
 krb5_error_code
 des_read_password/*_v4_compat_crock*/(k,prompt,verify)
     mit_des_cblock *k;
@@ -39,23 +160,15 @@ des_read_password/*_v4_compat_crock*/(k,prompt,verify)
     int        verify;
 {
     krb5_error_code ok;
-    krb5_error_code retval;
     char key_string[BUFSIZ];
     char prompt2[BUFSIZ];
-    int string_size = sizeof(key_string);
-
-    if (!krb4_global_context) {
-           retval = krb5_init_context(&krb4_global_context);
-           if (retval)
-                   return retval;
-    }
 
     if (verify) {
        strcpy(prompt2, "Verifying, please re-enter ");
        strncat(prompt2, prompt, sizeof(prompt2)-(strlen(prompt2)+1));
     }
-    ok = krb5_read_password(krb4_global_context, prompt, verify ? prompt2 : 0,
-                           key_string, &string_size);
+    ok = des_read_pw_string(key_string, sizeof(key_string),
+                           prompt, verify ? prompt2 : 0);
     
     if (ok == 0)
        des_string_to_key(key_string, k);
@@ -64,24 +177,3 @@ des_read_password/*_v4_compat_crock*/(k,prompt,verify)
     return ok;
 }
 
-krb5_error_code
-des_read_pw_string/*_v4_compat_crock*/(buf, bufsize, prompt, prompt2)
-    char *buf;
-    int bufsize;
-    char *prompt;
-    char *prompt2;
-{
-    krb5_error_code retval;
-    int i = bufsize;
-    
-    if (!krb4_global_context) {
-           retval = krb5_init_context(&krb4_global_context);
-           if (retval)
-                   return retval;
-    }
-
-    retval = krb5_read_password(krb4_global_context, prompt, prompt2,
-                           buf, &i);
-    return retval;
-}
-
index 5b2019bd430d839ccb4b7e4410af7b737d6e38ac..1230cf009adf4df0e8f57b1a3a7a3ca370c0f818 100644 (file)
@@ -21,7 +21,7 @@ static char rcsid_util_c[] =
 #include "k5-int.h"
 #include "des.h"
 
-des_cblock_print_file(x, fp)
+void des_cblock_print_file(x, fp)
     des_cblock *x;
     FILE *fp;
 {