date and time created 93/01/20 12:52:10 by dab
[unix-history] / usr / src / lib / libtelnet / read_password.c
CommitLineData
640d6f08
DB
1/*-
2 * Copyright (c) 1992 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
9static char sccsid[] = "@(#)read_password.c 5.1 (Berkeley) %G%";
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
33static 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
42int
43local_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
100lose:
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}