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