xref: /plan9-contrib/sys/src/ape/lib/v/plan9/getpass.c (revision 60014d6756a98ad10929607ca84a1b7488a16cfc)
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 	int c;
11 	char *p;
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, NULL);
20 	sig = signal(SIGINT, SIG_IGN);
21 	tty_echooff(fileno(fi));
22 	fprintf(stderr, "%s", prompt);
23 	fflush(stderr);
24 
25 	for (p = pbuf; (c = getc(fi)) != '\n' && c != EOF; )
26 		if (c == ('u' & 037))
27 			p = pbuf;
28 		else if (c == '\b') {
29 			if (p > pbuf)
30 				p--;
31 		} else if (p < &pbuf[8])
32 			*p++ = c;
33 	*p = '\0';
34 
35 	fprintf(stderr, "\n");
36 	fflush(stderr);
37 	tty_echoon(fileno(fi));
38 	signal(SIGINT, sig);
39 	if (fi != stdin)
40 		fclose(fi);
41 	return(pbuf);
42 }
43