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