Commit | Line | Data |
---|---|---|
640d6f08 | 1 | /*- |
11794364 KB |
2 | * Copyright (c) 1992, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
640d6f08 DB |
4 | * |
5 | * %sccs.include.redist.c% | |
6 | */ | |
7 | ||
8 | #ifndef lint | |
11794364 | 9 | static char sccsid[] = "@(#)read_password.c 8.1 (Berkeley) %G%"; |
640d6f08 DB |
10 | #endif /* not lint */ |
11 | ||
12 | /* | |
13 | * $Source: /mit/kerberos/src/lib/des/RCS/read_password.c,v $ | |
14 | * $Author: jon $ | |
15 | * | |
16 | * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute | |
17 | * of Technology. | |
18 | * | |
19 | * For copying and distribution information, please see the file | |
20 | * <mit-copyright.h>. | |
21 | * | |
22 | * This routine prints the supplied string to standard | |
23 | * output as a prompt, and reads a password string without | |
24 | * echoing. | |
25 | */ | |
26 | ||
27 | #include <stdio.h> | |
28 | #include <strings.h> | |
29 | #include <sys/ioctl.h> | |
30 | #include <signal.h> | |
31 | #include <setjmp.h> | |
32 | ||
33 | static jmp_buf env; | |
34 | ||
35 | /*** Routines ****************************************************** */ | |
36 | /* | |
37 | * This version just returns the string, doesn't map to key. | |
38 | * | |
39 | * Returns 0 on success, non-zero on failure. | |
40 | */ | |
41 | ||
42 | int | |
43 | local_des_read_pw_string(s,max,prompt,verify) | |
44 | char *s; | |
45 | int max; | |
46 | char *prompt; | |
47 | int verify; | |
48 | { | |
49 | int ok = 0; | |
50 | char *ptr; | |
51 | ||
52 | jmp_buf old_env; | |
53 | struct sgttyb tty_state; | |
54 | char key_string[BUFSIZ]; | |
55 | ||
56 | if (max > BUFSIZ) { | |
57 | return -1; | |
58 | } | |
59 | ||
60 | /* XXX assume jmp_buf is typedef'ed to an array */ | |
61 | bcopy((char *)old_env, (char *)env, sizeof(env)); | |
62 | if (setjmp(env)) | |
63 | goto lose; | |
64 | ||
65 | /* save terminal state*/ | |
66 | if (ioctl(0,TIOCGETP,(char *)&tty_state) == -1) | |
67 | return -1; | |
68 | /* | |
69 | push_signals(); | |
70 | */ | |
71 | /* Turn off echo */ | |
72 | tty_state.sg_flags &= ~ECHO; | |
73 | if (ioctl(0,TIOCSETP,(char *)&tty_state) == -1) | |
74 | return -1; | |
75 | while (!ok) { | |
76 | (void) printf(prompt); | |
77 | (void) fflush(stdout); | |
78 | while (!fgets(s, max, stdin)); | |
79 | ||
80 | if ((ptr = index(s, '\n'))) | |
81 | *ptr = '\0'; | |
82 | if (verify) { | |
83 | printf("\nVerifying, please re-enter %s",prompt); | |
84 | (void) fflush(stdout); | |
85 | if (!fgets(key_string, sizeof(key_string), stdin)) { | |
86 | clearerr(stdin); | |
87 | continue; | |
88 | } | |
89 | if ((ptr = index(key_string, '\n'))) | |
90 | *ptr = '\0'; | |
91 | if (strcmp(s,key_string)) { | |
92 | printf("\n\07\07Mismatch - try again\n"); | |
93 | (void) fflush(stdout); | |
94 | continue; | |
95 | } | |
96 | } | |
97 | ok = 1; | |
98 | } | |
99 | ||
100 | lose: | |
101 | if (!ok) | |
102 | bzero(s, max); | |
103 | printf("\n"); | |
104 | /* turn echo back on */ | |
105 | tty_state.sg_flags |= ECHO; | |
106 | if (ioctl(0,TIOCSETP,(char *)&tty_state)) | |
107 | ok = 0; | |
108 | /* | |
109 | pop_signals(); | |
110 | */ | |
111 | bcopy((char *)env, (char *)old_env, sizeof(env)); | |
112 | if (verify) | |
113 | bzero(key_string, sizeof (key_string)); | |
114 | s[max-1] = 0; /* force termination */ | |
115 | return !ok; /* return nonzero if not okay */ | |
116 | } |