xref: /plan9-contrib/sys/src/ape/lib/v/plan9/getpass.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #define _POSIX_SOURCE
2 #define _RESEARCH_SOURCE
3 #include <stdio.h>
4 #include <signal.h>
5 #include <libv.h>
6 
7 char *
8 getpass(char *prompt)
9 {
10 	register char *p;
11 	register c;
12 	FILE *fi;
13 	static char pbuf[9];
14 	void (*sig)(int);
15 
16 	if ((fi = fopen("/dev/cons", "r")) == NULL)
17 		fi = stdin;
18 	else
19 		setbuf(fi, (char *)NULL);
20 	sig = signal(SIGINT, SIG_IGN);
21 	tty_echooff(fileno(fi));
22 	fprintf(stderr, "%s", prompt); fflush(stderr);
23 	for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
24 		if (p < &pbuf[8])
25 			*p++ = c;
26 	}
27 	*p = '\0';
28 	fprintf(stderr, "\n"); fflush(stderr);
29 	tty_echoon(fileno(fi));
30 	signal(SIGINT, sig);
31 	if (fi != stdin)
32 		fclose(fi);
33 	return(pbuf);
34 }
35