xref: /plan9/sys/src/cmd/auth/lib/readln.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <auth.h>
4*219b2ee8SDavid du Colombier #include "authsrv.h"
5*219b2ee8SDavid du Colombier 
6*219b2ee8SDavid du Colombier void
7*219b2ee8SDavid du Colombier getpass(char *key, int check)
8*219b2ee8SDavid du Colombier {
9*219b2ee8SDavid du Colombier 	char pass[32], rpass[32];
10*219b2ee8SDavid du Colombier 	char *err;
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier 	readln("Password: ", pass, sizeof pass, 1);
13*219b2ee8SDavid du Colombier 	readln("Confirm password: ", rpass, sizeof rpass, 1);
14*219b2ee8SDavid du Colombier 	if(strcmp(pass, rpass) != 0)
15*219b2ee8SDavid du Colombier 		error("password mismatch");
16*219b2ee8SDavid du Colombier 	if(!passtokey(key, pass))
17*219b2ee8SDavid du Colombier 		error("bad password");
18*219b2ee8SDavid du Colombier 	if(check)
19*219b2ee8SDavid du Colombier 		if(err = okpasswd(pass))
20*219b2ee8SDavid du Colombier 			error(err);
21*219b2ee8SDavid du Colombier }
22*219b2ee8SDavid du Colombier 
23*219b2ee8SDavid du Colombier void
24*219b2ee8SDavid du Colombier readln(char *prompt, char *line, int len, int raw)
25*219b2ee8SDavid du Colombier {
26*219b2ee8SDavid du Colombier 	char *p;
27*219b2ee8SDavid du Colombier 	int fd, ctl, n, nr;
28*219b2ee8SDavid du Colombier 
29*219b2ee8SDavid du Colombier 	fd = open("/dev/cons", ORDWR);
30*219b2ee8SDavid du Colombier 	if(fd < 0)
31*219b2ee8SDavid du Colombier 		error("couldn't open cons");
32*219b2ee8SDavid du Colombier 	if(raw){
33*219b2ee8SDavid du Colombier 		ctl = open("/dev/consctl", OWRITE);
34*219b2ee8SDavid du Colombier 		if(ctl < 0)
35*219b2ee8SDavid du Colombier 			error("couldn't set raw mode");
36*219b2ee8SDavid du Colombier 		write(ctl, "rawon", 5);
37*219b2ee8SDavid du Colombier 	} else
38*219b2ee8SDavid du Colombier 		ctl = -1;
39*219b2ee8SDavid du Colombier 	fprint(fd, "%s", prompt);
40*219b2ee8SDavid du Colombier 	nr = 0;
41*219b2ee8SDavid du Colombier 	p = line;
42*219b2ee8SDavid du Colombier 	for(;;){
43*219b2ee8SDavid du Colombier 		n = read(fd, p, 1);
44*219b2ee8SDavid du Colombier 		if(n < 0){
45*219b2ee8SDavid du Colombier 			close(fd);
46*219b2ee8SDavid du Colombier 			close(ctl);
47*219b2ee8SDavid du Colombier 			error("can't read cons\n");
48*219b2ee8SDavid du Colombier 		}
49*219b2ee8SDavid du Colombier 		if(*p == 0x7f)
50*219b2ee8SDavid du Colombier 			exits(0);
51*219b2ee8SDavid du Colombier 		if(n == 0 || *p == '\n' || *p == '\r'){
52*219b2ee8SDavid du Colombier 			*p = '\0';
53*219b2ee8SDavid du Colombier 			if(raw)
54*219b2ee8SDavid du Colombier 				write(fd, "\n", 1);
55*219b2ee8SDavid du Colombier 			close(fd);
56*219b2ee8SDavid du Colombier 			close(ctl);
57*219b2ee8SDavid du Colombier 			return;
58*219b2ee8SDavid du Colombier 		}
59*219b2ee8SDavid du Colombier 		if(*p == '\b'){
60*219b2ee8SDavid du Colombier 			if(nr > 0){
61*219b2ee8SDavid du Colombier 				nr--;
62*219b2ee8SDavid du Colombier 				p--;
63*219b2ee8SDavid du Colombier 			}
64*219b2ee8SDavid du Colombier 		}else{
65*219b2ee8SDavid du Colombier 			nr++;
66*219b2ee8SDavid du Colombier 			p++;
67*219b2ee8SDavid du Colombier 		}
68*219b2ee8SDavid du Colombier 		if(nr == len){
69*219b2ee8SDavid du Colombier 			fprint(fd, "line too long; try again\n");
70*219b2ee8SDavid du Colombier 			nr = 0;
71*219b2ee8SDavid du Colombier 			p = line;
72*219b2ee8SDavid du Colombier 		}
73*219b2ee8SDavid du Colombier 	}
74*219b2ee8SDavid du Colombier }
75