xref: /csrg-svn/lib/libc/gen/getpass.c (revision 16497)
1*16497Sralph /* @(#)getpass.c	4.3 (Berkeley) 05/16/84 */
22017Swnj #include <stdio.h>
32017Swnj #include <signal.h>
42017Swnj #include <sgtty.h>
52017Swnj 
62017Swnj char *
72017Swnj getpass(prompt)
82017Swnj char *prompt;
92017Swnj {
102017Swnj 	struct sgttyb ttyb;
112017Swnj 	int flags;
122017Swnj 	register char *p;
132017Swnj 	register c;
142017Swnj 	FILE *fi;
152017Swnj 	static char pbuf[9];
162017Swnj 	int (*signal())();
172017Swnj 	int (*sig)();
182017Swnj 
192017Swnj 	if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
202017Swnj 		fi = stdin;
212017Swnj 	else
222017Swnj 		setbuf(fi, (char *)NULL);
232017Swnj 	sig = signal(SIGINT, SIG_IGN);
24*16497Sralph 	ioctl(fileno(fi), TIOCGETP, &ttyb);
252017Swnj 	flags = ttyb.sg_flags;
262017Swnj 	ttyb.sg_flags &= ~ECHO;
27*16497Sralph 	ioctl(fileno(fi), TIOCSETP, &ttyb);
283919Sroot 	fprintf(stderr, "%s", prompt); fflush(stderr);
292017Swnj 	for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
302017Swnj 		if (p < &pbuf[8])
312017Swnj 			*p++ = c;
322017Swnj 	}
332017Swnj 	*p = '\0';
343919Sroot 	fprintf(stderr, "\n"); fflush(stderr);
352017Swnj 	ttyb.sg_flags = flags;
36*16497Sralph 	ioctl(fileno(fi), TIOCSETP, &ttyb);
372017Swnj 	signal(SIGINT, sig);
382017Swnj 	if (fi != stdin)
392017Swnj 		fclose(fi);
402017Swnj 	return(pbuf);
412017Swnj }
42