xref: /csrg-svn/lib/libc/gen/getpass.c (revision 26559)
1*26559Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*26559Sdonn static char sccsid[] = "@(#)getpass.c	5.2 (Berkeley) 03/09/86";
3*26559Sdonn #endif LIBC_SCCS and not lint
422094Smckusick 
52017Swnj #include <stdio.h>
62017Swnj #include <signal.h>
72017Swnj #include <sgtty.h>
82017Swnj 
92017Swnj char *
102017Swnj getpass(prompt)
112017Swnj char *prompt;
122017Swnj {
132017Swnj 	struct sgttyb ttyb;
142017Swnj 	int flags;
152017Swnj 	register char *p;
162017Swnj 	register c;
172017Swnj 	FILE *fi;
182017Swnj 	static char pbuf[9];
192017Swnj 	int (*signal())();
202017Swnj 	int (*sig)();
212017Swnj 
222017Swnj 	if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
232017Swnj 		fi = stdin;
242017Swnj 	else
252017Swnj 		setbuf(fi, (char *)NULL);
262017Swnj 	sig = signal(SIGINT, SIG_IGN);
2716497Sralph 	ioctl(fileno(fi), TIOCGETP, &ttyb);
282017Swnj 	flags = ttyb.sg_flags;
292017Swnj 	ttyb.sg_flags &= ~ECHO;
3016497Sralph 	ioctl(fileno(fi), TIOCSETP, &ttyb);
313919Sroot 	fprintf(stderr, "%s", prompt); fflush(stderr);
322017Swnj 	for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
332017Swnj 		if (p < &pbuf[8])
342017Swnj 			*p++ = c;
352017Swnj 	}
362017Swnj 	*p = '\0';
373919Sroot 	fprintf(stderr, "\n"); fflush(stderr);
382017Swnj 	ttyb.sg_flags = flags;
3916497Sralph 	ioctl(fileno(fi), TIOCSETP, &ttyb);
402017Swnj 	signal(SIGINT, sig);
412017Swnj 	if (fi != stdin)
422017Swnj 		fclose(fi);
432017Swnj 	return(pbuf);
442017Swnj }
45