xref: /csrg-svn/lib/libc/gen/getpass.c (revision 3919)
1*3919Sroot /* @(#)getpass.c	4.2 (Berkeley) 07/01/81 */
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);
242017Swnj 	gtty(fileno(fi), &ttyb);
252017Swnj 	flags = ttyb.sg_flags;
262017Swnj 	ttyb.sg_flags &= ~ECHO;
272017Swnj 	stty(fileno(fi), &ttyb);
28*3919Sroot 	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';
34*3919Sroot 	fprintf(stderr, "\n"); fflush(stderr);
352017Swnj 	ttyb.sg_flags = flags;
362017Swnj 	stty(fileno(fi), &ttyb);
372017Swnj 	signal(SIGINT, sig);
382017Swnj 	if (fi != stdin)
392017Swnj 		fclose(fi);
402017Swnj 	return(pbuf);
412017Swnj }
42