xref: /plan9-contrib/sys/src/ape/lib/v/plan9/getpass.c (revision bad30d5d5a5510556b3d04cddb2a7590f26fb546)
13e12c5d1SDavid du Colombier #define _POSIX_SOURCE
23e12c5d1SDavid du Colombier #define _RESEARCH_SOURCE
33e12c5d1SDavid du Colombier #include <stdio.h>
43e12c5d1SDavid du Colombier #include <signal.h>
5*bad30d5dSDavid du Colombier #include <limits.h>
63e12c5d1SDavid du Colombier #include <libv.h>
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier char *
getpass(char * prompt)93e12c5d1SDavid du Colombier getpass(char *prompt)
103e12c5d1SDavid du Colombier {
111dce3b00SDavid du Colombier 	int c;
121dce3b00SDavid du Colombier 	char *p;
133e12c5d1SDavid du Colombier 	FILE *fi;
14*bad30d5dSDavid du Colombier 	static char pbuf[PASS_MAX];
153e12c5d1SDavid du Colombier 	void (*sig)(int);
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier 	if ((fi = fopen("/dev/cons", "r")) == NULL)
183e12c5d1SDavid du Colombier 		fi = stdin;
193e12c5d1SDavid du Colombier 	else
201dce3b00SDavid du Colombier 		setbuf(fi, NULL);
213e12c5d1SDavid du Colombier 	sig = signal(SIGINT, SIG_IGN);
223e12c5d1SDavid du Colombier 	tty_echooff(fileno(fi));
231dce3b00SDavid du Colombier 	fprintf(stderr, "%s", prompt);
241dce3b00SDavid du Colombier 	fflush(stderr);
251dce3b00SDavid du Colombier 
261dce3b00SDavid du Colombier 	for (p = pbuf; (c = getc(fi)) != '\n' && c != EOF; )
271dce3b00SDavid du Colombier 		if (c == ('u' & 037))
281dce3b00SDavid du Colombier 			p = pbuf;
291dce3b00SDavid du Colombier 		else if (c == '\b') {
301dce3b00SDavid du Colombier 			if (p > pbuf)
311dce3b00SDavid du Colombier 				p--;
32*bad30d5dSDavid du Colombier 		} else if (p < &pbuf[sizeof(pbuf)-1])
333e12c5d1SDavid du Colombier 			*p++ = c;
343e12c5d1SDavid du Colombier 	*p = '\0';
351dce3b00SDavid du Colombier 
361dce3b00SDavid du Colombier 	fprintf(stderr, "\n");
371dce3b00SDavid du Colombier 	fflush(stderr);
383e12c5d1SDavid du Colombier 	tty_echoon(fileno(fi));
393e12c5d1SDavid du Colombier 	signal(SIGINT, sig);
403e12c5d1SDavid du Colombier 	if (fi != stdin)
413e12c5d1SDavid du Colombier 		fclose(fi);
423e12c5d1SDavid du Colombier 	return(pbuf);
433e12c5d1SDavid du Colombier }
44