xref: /plan9/sys/src/cmd/auth/secstore/util.c (revision c65b13b8b6bafd3c8441df3c93197f1641ec1c6f)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier 
49a747e4fSDavid du Colombier void *
59a747e4fSDavid du Colombier emalloc(ulong n)
69a747e4fSDavid du Colombier {
79a747e4fSDavid du Colombier 	void *p = malloc(n);
89a747e4fSDavid du Colombier 	if(p == nil)
99a747e4fSDavid du Colombier 		sysfatal("emalloc");
109a747e4fSDavid du Colombier 	memset(p, 0, n);
119a747e4fSDavid du Colombier 	return p;
129a747e4fSDavid du Colombier }
139a747e4fSDavid du Colombier 
149a747e4fSDavid du Colombier void *
159a747e4fSDavid du Colombier erealloc(void *p, ulong n)
169a747e4fSDavid du Colombier {
179a747e4fSDavid du Colombier 	if ((p = realloc(p, n)) == nil)
189a747e4fSDavid du Colombier 		sysfatal("erealloc");
199a747e4fSDavid du Colombier 	return p;
209a747e4fSDavid du Colombier }
219a747e4fSDavid du Colombier 
229a747e4fSDavid du Colombier char *
239a747e4fSDavid du Colombier estrdup(char *s)
249a747e4fSDavid du Colombier {
259a747e4fSDavid du Colombier 	if ((s = strdup(s)) == nil)
269a747e4fSDavid du Colombier 		sysfatal("estrdup");
279a747e4fSDavid du Colombier 	return s;
289a747e4fSDavid du Colombier }
299a747e4fSDavid du Colombier 
30b27b55e2SDavid du Colombier char*
31*c65b13b8SDavid du Colombier getpassm(char *prompt)
329a747e4fSDavid du Colombier {
33b27b55e2SDavid du Colombier 	char *p, line[4096];
349a747e4fSDavid du Colombier 	int n, nr;
359a747e4fSDavid du Colombier 	static int cons, consctl;  // closing and reopening fails in ssh environment
369a747e4fSDavid du Colombier 
379a747e4fSDavid du Colombier 	if(cons == 0){ // first time
389a747e4fSDavid du Colombier 		cons = open("/dev/cons", ORDWR);
399a747e4fSDavid du Colombier 		if(cons < 0){
409a747e4fSDavid du Colombier 			fprint(2, "couldn't open cons\n");
419a747e4fSDavid du Colombier 			exits("no cons");
429a747e4fSDavid du Colombier 		}
439a747e4fSDavid du Colombier 		consctl = open("/dev/consctl", OWRITE);
449a747e4fSDavid du Colombier 		if(consctl < 0){
459a747e4fSDavid du Colombier 			fprint(2, "couldn't set raw mode\n");
469a747e4fSDavid du Colombier 			exits("no consctl");
479a747e4fSDavid du Colombier 		}
489a747e4fSDavid du Colombier 	}
499a747e4fSDavid du Colombier 	fprint(consctl, "rawon");
509a747e4fSDavid du Colombier 	fprint(cons, "%s", prompt);
519a747e4fSDavid du Colombier 	nr = 0;
529a747e4fSDavid du Colombier 	p = line;
539a747e4fSDavid du Colombier 	for(;;){
549a747e4fSDavid du Colombier 		n = read(cons, p, 1);
559a747e4fSDavid du Colombier 		if(n < 0){
569a747e4fSDavid du Colombier 			fprint(consctl, "rawoff");
579a747e4fSDavid du Colombier 			fprint(cons, "\n");
58b27b55e2SDavid du Colombier 			return nil;
599a747e4fSDavid du Colombier 		}
605d459b5aSDavid du Colombier 		if(n == 0 || *p == '\n' || *p == '\r' || *p == 0x7f){
619a747e4fSDavid du Colombier 			*p = '\0';
629a747e4fSDavid du Colombier 			fprint(consctl, "rawoff");
639a747e4fSDavid du Colombier 			fprint(cons, "\n");
64b27b55e2SDavid du Colombier 			p = strdup(line);
65b27b55e2SDavid du Colombier 			memset(line, 0, nr);
66b27b55e2SDavid du Colombier 			return p;
679a747e4fSDavid du Colombier 		}
689a747e4fSDavid du Colombier 		if(*p == '\b'){
699a747e4fSDavid du Colombier 			if(nr > 0){
709a747e4fSDavid du Colombier 				nr--;
719a747e4fSDavid du Colombier 				p--;
729a747e4fSDavid du Colombier 			}
739a747e4fSDavid du Colombier 		}else if(*p == 21){		/* cntrl-u */
749a747e4fSDavid du Colombier 			fprint(cons, "\n%s", prompt);
759a747e4fSDavid du Colombier 			nr = 0;
769a747e4fSDavid du Colombier 			p = line;
779a747e4fSDavid du Colombier 		}else{
789a747e4fSDavid du Colombier 			nr++;
799a747e4fSDavid du Colombier 			p++;
809a747e4fSDavid du Colombier 		}
81b27b55e2SDavid du Colombier 		if(nr+1 == sizeof line){
829a747e4fSDavid du Colombier 			fprint(cons, "line too long; try again\n%s", prompt);
839a747e4fSDavid du Colombier 			nr = 0;
849a747e4fSDavid du Colombier 			p = line;
859a747e4fSDavid du Colombier 		}
869a747e4fSDavid du Colombier 	}
87b27b55e2SDavid du Colombier 	return nil;  // NOT REACHED
889a747e4fSDavid du Colombier }
89