xref: /csrg-svn/lib/libc/gen/getpass.c (revision 2017)
1*2017Swnj /* @(#)getpass.c	4.1 (Berkeley) 12/21/80 */
2*2017Swnj #include <stdio.h>
3*2017Swnj #include <signal.h>
4*2017Swnj #include <sgtty.h>
5*2017Swnj 
6*2017Swnj char *
7*2017Swnj getpass(prompt)
8*2017Swnj char *prompt;
9*2017Swnj {
10*2017Swnj 	struct sgttyb ttyb;
11*2017Swnj 	int flags;
12*2017Swnj 	register char *p;
13*2017Swnj 	register c;
14*2017Swnj 	FILE *fi;
15*2017Swnj 	static char pbuf[9];
16*2017Swnj 	int (*signal())();
17*2017Swnj 	int (*sig)();
18*2017Swnj 
19*2017Swnj 	if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
20*2017Swnj 		fi = stdin;
21*2017Swnj 	else
22*2017Swnj 		setbuf(fi, (char *)NULL);
23*2017Swnj 	sig = signal(SIGINT, SIG_IGN);
24*2017Swnj 	gtty(fileno(fi), &ttyb);
25*2017Swnj 	flags = ttyb.sg_flags;
26*2017Swnj 	ttyb.sg_flags &= ~ECHO;
27*2017Swnj 	stty(fileno(fi), &ttyb);
28*2017Swnj 	fprintf(stderr, prompt);
29*2017Swnj 	for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
30*2017Swnj 		if (p < &pbuf[8])
31*2017Swnj 			*p++ = c;
32*2017Swnj 	}
33*2017Swnj 	*p = '\0';
34*2017Swnj 	fprintf(stderr, "\n");
35*2017Swnj 	ttyb.sg_flags = flags;
36*2017Swnj 	stty(fileno(fi), &ttyb);
37*2017Swnj 	signal(SIGINT, sig);
38*2017Swnj 	if (fi != stdin)
39*2017Swnj 		fclose(fi);
40*2017Swnj 	return(pbuf);
41*2017Swnj }
42